您的位置:首页 > 其它

给定一个字符串s和一个单词dict的字典,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。

2017-10-03 09:48 801 查看
1  暴力破解 双重循环

vector<string> wordBreak(string s, unordered_set<string> &dict) {
vector<string> result;
if(s.length()==0)
return result;
for(int i=0;i<s.length();i++){
string strs;
for(int j=i;j<=s.length();j++){
string str=s.substr(i,j-i+1);
if(dict.count(str)){
strs+=str;
strs+=" ";
}
}
result.push_back(strs);
}
return result;
}

2 动态规划
 用dp存储子串是否在 字典中

class Solution {
vector<bool> *dp;   //存的字符串的子串是否在字典中
vector<string> mystring;
vector<string> result;
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
dp=new vector<bool>[s.size()];
for(int i=0;i<s.size();i++){
for(int j=i;j<s.size();j++){
dp[i].push_back(match(s.substr(i,j-i+1),dict));
}
}
handleStr(s.size()-1,s);
return result;
}
bool match(string str,unordered_set<string> &dict){
if(dict.count(str))
return true;
return false;
}
void handleStr(int i,string s){
if(i==-1){//递归终止条件
string str;
for(int j=mystring.size()-1;j>=0;j--){
str += mystring[j];
if(j!=0)
str+=" ";
}
result.push_back(str);
}else{
for(int k=0;k<=i;k++){
if(dp[k][i-k]){
mystring.push_back(s.substr(k,i-k+1));
handleStr(k-1,s);
mystring.pop_back();
}
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐