您的位置:首页 > 其它

leetCode_Word BreakII

2016-09-22 14:39 423 查看
题意:给定一个字符串和一个单词序列,判断该字符串能不能分成若干个子串,且每个子串是单词序列的词。给出所有分法。

解法:分为两个步骤:首先判断是否能分,然后再给出所有的分法。

判断是否能分:从后向前扫描,如果从某一位置到字符串的结尾在单词序列里,或者某一序列在单词序列并且这一序列的下一个字母已经被验证能分,则isOk[i]=true,只要判断isOk[0]是否为true就可以。

给出所有分法:文字讲述比较绕。用vector<vector<string>>代表每一个下标开始对应的分法,最后只要返回vector[0]即可。如何记录分法?和刚才一样,分成两种情况。对于某一个位置,如果到结尾这一段在字典里,直接放到vector<string>里,如果从该位置到另一个非结尾的位置再字典里,如果结尾的位置下一位置的vector<string>不为空,则把这个单词加上那个下一个位置的vector<string>的每一个string进行连接,放在该位置对应的vector<string>里。返回vector[0]即可。

代码:

vector<string> wordBreak(string s, unordered_set<string>& wordDict)
{
int i,j,k,length=s.length();
vector<vector<string>> ans;
vector<string> temp;
vector<bool> isOk;
for(i=0; i<length; i++)
{
ans.push_back(temp);
isOk.push_back(false);
}
for(i=length-1;i>=0;i--)
{
for(j=i;j<length;j++)
{
if(wordDict.find(s.substr(i,j-i+1))!=wordDict.end())
{
if(j==length-1 || isOk[j+1]==true)
{
isOk[i]=true;
break;
}
}
}
}
if(isOk[0]==false) return temp;
for(i=length-1; i>=0; i--)
{
for(j=i; j<length; j++)
{
if(wordDict.find(s.substr(i,j-i+1))!=wordDict.end())
{
if(j==length-1) ans[i].push_back(s.substr(i,j-i+1));
else if(ans[j+1].size()>0)
{
temp=ans[j+1];
for(k=0; k<temp.size(); k++)
{
string tempString=s.substr(i,j-i+1);
tempString+=" ";
tempString+=ans[j+1][k];
ans[i].push_back(tempString);
}
}
}
}
cout<<i<<" "<<ans[i].size()<<endl;
}
return ans[0];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: