思路如下:
1、记录一个整型标志位,表示当前遍历查找的起始点
2、利用递归不断向后遍历
3、定义一个memo布尔数组,记录当前位置为起点的s子字符串是否在字典里,可以避免多次重复遍历
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Boolean[]memo=new Boolean[s.length()];
return helper(s,wordDict,memo,0);
}
public boolean helper(String s,List<String>wordDict,Boolean[]memo,int start){
//当遍历到最后,说明s均在字典中,返回true
if(start==s.length()){
return true;
}
//如果记忆数组memo在该点已经记录了,则可以直接返回true或false
if(memo[start]!=null){
return memo[start];
}
//如果start为起点的子字符串未被遍历,则从start开始遍历
for(int end=start+1;end<=s.length();end++){
//如果从start到end的子字符串在字典里,且再对从end开始的后续遍历也都为true,则说明从start开始的字符串在字典里
if(wordDict.contains(s.substring(start,end))&&helper(s,wordDict,memo,end)){
//memo记录start开始的字符串在字典里,为true
memo[start]=true;
return memo[start];
}
}
//遍历完发现从start开始的字符串不在字典里,则memo记录为false,并返回
memo[start]=false;
return memo[start];
}
}
原题地址:
139. 单词拆分