【leetcode】139.(Medium)Word Break
解題思路:
DP,解法來自題目後面討論區,這道題用回溯會超時
時間複雜度:O(n^2)
空間複雜度:O(n)
提交程式碼:
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp=new boolean[s.length()];
for(int i=1;i<=s.length();i++) {
for(int j=0;j<i;j++) {
String tmp=s.substring (j, i);
if(wordDict.contains(tmp)&&(j==0||dp[j-1])) {
dp[i-1]=true;
break;
}
}
}
return dp[s.length()-1];
}
}
執行結果:
相關推薦
【leetcode】139.(Medium)Word Break
解題思路: DP,解法來自題目後面討論區,這道題用回溯會超時 時間複雜度:O(n^2) 空間複雜度:O(n) 提交程式碼: class Solution { public boolean wordBreak(String s, List<String> wo
【leetcode】127.(Medium)Word Ladder
解題思路: 首先將所有的單詞對映為一張map:其中鍵是每一個單詞,值是一個數組,對應和這個單詞只差一個字母的所有的單詞;然後利用BFS找到一條最短路徑。 時間複雜度:O(n) 提交程式碼: class Solution { public int ladderLength
【leetcode】140.(Hard)Word Break II
解題思路: DP 首先建立一個boolean表用於記錄從字串哪些位置可以是一個word 然後使用DFS來遍歷結果 時間複雜度:O(n^2) 空間複雜度:O(n) 提交程式碼: class Solution{ public List<String> wordBreak
【leetcode】50.(Medium )Pow(x,n)
題目連結 解題思路: 這道題的意思就是求x的n次方。 如果xx求下去,求n-1次,這樣是超時的。 我的思路是,首先求xx,然後n就可以減少2,然後求(xx)(x*x),這樣n就可以減少4… 就是n不是-1、-1、-1…這樣減下去,而是-2、-4、-8…這樣減下去 迭代cnt次後,
【leetcode】48.(Medium)Rotate Image
題目連結 解題思路: 首先如果二維陣列是11或者22,直接蠻力計算; 如果是22以上,可以一圈一圈(rotate circle)地計算反轉90度之後的結果。 比如,對於下面55的陣列: 首先設定一個數組tmp將框1中的數字儲存起來, 然後計算翻轉後框1(top layer)中的
【leetcode】47.(Medium)PermutationsII
題目連結 解題思路: 參考 首先進行排序; 如果陣列中沒有重複的數字,就按照permutations的方法來做就可以了; 如果陣列中有2個重複的數字,比如[1,1,3],首先將陣列分為[1]和[1,3], 對[1,3]進行全排列有[1,3]和[3,1],在所有子全排列中
【leetcode】46. (Medium )Permutations
題目連結 解題思路: 這道題的意思就是給你一組數,其中的數字都不一樣,然後求這些數字所有的全排列組合。 比較簡單的思路是: 1.首先如果陣列中只有一個數比如2,那就只返回這個數構成的全排列; 2.如果有兩個數比如1,2那先求2全排列,可以得到[[2]], 然後在這些子全排
【leetcode】74. (Medium)Search a 2D Matrix
解題思路: 先找到在哪一行 再找在哪個位置 提交程式碼: class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix.length==0||matri
【leetcode】73.(Medium)Set Matrix Zeroes
解題思路: 首先空間複雜度為O(m*n)的做法是,直接copy一套matrix來記錄 空間複雜度為O(m+n)的做法是設定陣列row[m]和column[n]來記錄每行每列的0的情況 空間複雜度為O(1)的情況就是設定兩個boolean變數,首先判定第一行和第一列是否會最終變為0,然後從第一
【leetcode】71.(Medium)Simplify Pathes
解題思路: 用一個List(pathes)維護有效路徑,遇到有效的路徑就加進pathes裡面,遇到“. .”先看pathes是否為空,為空就不管,不為空就刪掉pathes中的最後一個有效路徑。 最後將這個記錄了有效路徑的List(pathes)轉化為String的格式並返回。 提交
【leetcode】63. (Medium)Unique Pathes II
解題思路: 和Unique Path差不多 提交程式碼: class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m=obstacleGrid.lengt
【leetcode】92.(Medium)Reverse Linked List II
解題思路: 這道題的意思是,有一串連結串列,將第m位到第n位翻轉過來,比如對於連結串列1-2-3-4-5,翻轉第2到第4位後就是1-4-3-2-5 題目要求只遍歷一遍連結串列 我的想法是將翻轉的部分用棧存起來,然後重新新建結點 general的做法是直接修改原連結串列的結點指向關係,比如
【leetcode】91.(Medium)Decode Ways
解題思路: 剛開始用的回溯,後來發現正解用DP,感覺好多關於字串的題都是用DP來做的 提交程式碼:回溯 class Solution { public int numDecodings(String s) { if(s.length()==0||s.ch
【leetcode】90.(Medium)Subsets II
解題思路: 和subsets I相比多了一個start位置的設定。 對於[1,2,2] 有初始子集合:[] [1] 對於nums[1]=2,由於nums[1]!=nums[0],故從0位開始疊加2並加入到結果中,可得: [] [1] [2] [1,2] 對於nums[2]=2,由於num
【leetcode】89.(Medium)Gray Code
解題思路:中序Morris遍歷 我的想法是回溯,討論區直接給出了格雷碼關於i的表示式:gray[i]=i^(i/2) 即取i和i/2按位異或 提交程式碼:回溯 class Solution { public List<Integer> grayCode(in
【Leetcode】86.(Medium)Partition List
解題思路: 這道題我將list轉化為了ArrayList來做 基本思路是先將連結串列轉化為ArrayList,然後找到第一個大於等於x的數字,並記下位置flag。然後從後向前,如果是小於x的數就插入到flag的位置。比較耗時的地方是每次將數字插入到flag的位置時,ArrayList會將所有
【leetcode】93.(Medium)Restore IP Addresses
解題思路: 回溯 提交程式碼:回溯 class Solution { public List<String> restoreIpAddresses(String s) { List<String> ans=new ArrayList&
【leetcode】126.(Hard)Word Ladder II
解題思路: 以下面這個例子進行說明: Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”] Output: [ [“hit”,“ho
【leetcode】96.(Medium)Unique Binary Search Tree
解題思路: 動態規劃 首先當結點數為1和0時設定樹的個數為1 假設我已經求出來了結點數小於n的所有結果,現在當樹的個數為n時, 樹的根節點可以是1-n。 當樹的根是i是,左邊有i-1個節點,右邊有n-i個節點,及當根是i時,可以有F[i-1]*F[n-i]顆樹 遍歷一遍1-n即可
【leetcode】95.(Medium)Unique Binary Search Tree II
解題思路: 這道題的意思是,給定n,求出所有包含1-n值的中序遍歷樹 提交程式碼: class Solution { public List<TreeNode> generateTrees(int n) { List<TreeNode> res=n