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];
}
}
}