[抄題]:算法
給出一個字符串s和一個詞典,判斷字符串s是否能夠被空格切分紅一個或多個出如今字典中的單詞。數組
s = "lintcode"數據結構
dict = ["lint","code"]ide
返回 true 由於"lintcode"能夠被空格切分紅"lint code"spa
[思惟問題]:debug
看到字符串就怕:仍是要掌握通常規律code
[一句話思路]:blog
仍是看rU手冊456頁的解法吧字符串
前部完美切分+後部是單詞string
[輸入量]:空: 正常狀況:特大:特小:程序裏處理到的特殊狀況:異常狀況(不合法不合理的輸入):
[畫圖]:
"aaaaaaa" ["aaaa","aa"] false。f[2] = f["li"] f[0] f[所有]都是true
lin完美切分+t在詞典中
[一刷]:
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分鐘肉眼debug的結果]:
[總結]:
爲了取出長度爲j的單詞,起點實際上是i - j
[複雜度]:Time complexity: O(n*l^2+m) Space complexity: O(n^2)
查詢字符串是否在詞典中也是n
N字符串長度
M單詞個數
L單詞平均長度
[英文數據結構或算法,爲何不用別的數據結構或算法]:
從右邊開始切割,待判斷單詞由短到長,割到最大單詞長度L尚未便可終止。
從左邊開始切割,待判斷單詞由長到短,複雜度過高。
hash map查詢單詞,長度L不可忽略時,複雜度是L, 可忽略時爲1
[其餘解法]:
[Follow Up]:
[LC給出的題目變變變]:
word break2
[代碼風格] :
public class Solution { /* * @param s: A string * @param dict: A dictionary of words dict * @return: A boolean */ //maxLength private int maxLength (Set<String> dict) { int max = 0; for (String word : dict) { max = Math.max(max, word.length()); } return max; } public boolean wordBreak(String s, Set<String> dict) { //corner case if (s == null || dict == null) { return false; } //state //boolean can[] = new boolean[dict.size() + 1]; boolean can[] = new boolean[s.length() + 1]; int max_len = maxLength (dict); //initialization can[0] = true; //function for (int i = 1; i <= s.length(); i++) { can[i] = false; for (int j = 0; j <= i && j <= max_len; j++) { if (can[i - j] == false) { continue; } String word = s.substring(i - j, i); if (dict.contains(word)) { can[i] = true; break; } } } //answer return can[s.length()]; } }