题目描述
待实现的函数接口的形参类型,
bool wordBreak(string s, vector& wordDict) {
…
}分析
该题使用动态规划的思想能很快解决。我们需要明确以下几点,
1、只要能找到至少一种分割方法就可以返回true
2、找寻策略:将s从头开始,每次添加一个字符进行分割,看分割前后的两部分是否正好在字典里有。而分割前后的两部分的找寻策略同上。代码实现
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_map<string,int>dict; //转换wordDict的格式,便于后续操作
unordered_map<string,bool>log; //存储子结果
int maxlen=0; //字典中最长串的长度
//初始化数据
for(auto x:wordDict){
dict[x]++;
if(x.size()>maxlen)
maxlen=x.size();
}
//找寻是否可以拆解
return findBreak(s,dict,maxlen,log);
}
bool findBreak(string s, unordered_map<string,int>& dict,int maxlen,unordered_map<string,bool>& log){
if(s.size()==0 || dict[s]>0)
return true;
if(log.count(s)>0)
return log[s];
bool b=false;
for(int i=1;i<s.size()+1;i++){
if(i>maxlen)
break; //子串比字典中最长串还长
if(dict[s.substr(0,i)]>0)
b |= findBreak(s.substr(i),dict,maxlen,log);
if(b)
break; //至少找到了一种分割了
}
log[s]=b;
return b;
}
};