https://leetcode.com/problems/word-break/
哈哈這道題我覺得還是有點難度的,沒想到寫完代碼直接過,還超過了99%。當時就脫口而出WTF!爽到
說說我的思路。
我們要判斷一堆詞是否可以組成字符串s。那麼這個大問題,組成字符串s,可以被考慮成更小的一個問題,組成字符串s的一部分,因爲字符串是前往後匹配的,所以我們要匹配字符串s[0, end],那麼如果第一個單詞匹配上了,我們需要去匹配s[start, end]是否是OK的,如果曾經就計算過start, end是否匹配就好了,就不需要再計算了。
所以理一下,應該是拿着word字典挨個的比對,然後找到1個就遞歸進去,讓start += word.length(),這樣遞歸進去的方法,就是判斷它的子串是否可以匹配。
所以我們要存儲一下第start個字符,到最後是否能被匹配。
對於某個迭代,start = x,必須能從x找到一個匹配的字符串,並且遞歸進去,遞歸的返回結果也必須是true,纔算匹配成功。
那麼所有的思路整合到一起,就是下面的代碼。
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Boolean[] mem = new Boolean[s.length() + 1];
return helper(s, 0, wordDict, mem);
}
public boolean helper(String s, int start, List<String> wordDict, Boolean[] mem) {
if (start == s.length()) {
return true;
}
if (mem[start] != null) {
return mem[start];
} else {
mem[start] = false;
for (String key : wordDict) {
if (s.substring(start).startsWith(key)) {
mem[start] = helper(s, start + key.length(), wordDict, mem);
if (mem[start]) {
return mem[start];
}
}
}
return mem[start];
}
}
}