140. 单词拆分 II
思路:
1.每次找到一个可以切分的位置,就选择切分或者不切分,具体搜索时有3个状态,lastPos上一个被切分的状态,pos当前从哪里开始切分,status已经切分完毕加入合成的字符串,
例如说搜索到cat这个单词时,可以选择切分,那么lastPos就是2(t的下标),pos是3,则下一次搜索最短的情况是,lastPos+1到pos(接着搜索lastPos到pos+1,+2,+3);选择不切分,lastPos是-1,pos是3,下一次搜索最短的情况是,lastPos+1到pos
2.找到单词之后记得break(最开始没break效率低,而且出现了重复)
for(int i=pos;i<length;i++){
string t=find(S.substr(lastPos+1,i-lastPos));
if(t.length()){
string newStatus;
if(status.length()==0) newStatus=status+t;
else newStatus=status+" "+t;
wordBreakExecutor(i,i+1,newStatus);
wordBreakExecutor(lastPos,i+1,status);
break;
}
}
3.终止的条件是lastPos==length-1
if(lastPos==length-1&&status.length()>=length){
res.push_back(status);
return;
}
class Solution {
public:
vector<string> res;
int length;
string S;
vector<string> WordDict;
string find(string s){
for(auto i:WordDict){
if(s==i){
return i;
}
}
return "";
}
void wordBreakExecutor(int lastPos,int pos,string status){
if(lastPos==length-1&&status.length()>=length){
res.push_back(status);
return;
}
for(int i=pos;i<length;i++){
string t=find(S.substr(lastPos+1,i-lastPos));
if(t.length()){
string newStatus;
if(status.length()==0) newStatus=status+t;
else newStatus=status+" "+t;
wordBreakExecutor(i,i+1,newStatus);
wordBreakExecutor(lastPos,i+1,status);
break;
}
}
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
WordDict=wordDict;
S=s;
length=s.length();
wordBreakExecutor(-1,0,"");
return res;
}
};