您的位置:首页 > 其它

Word Break II (leetcode)

2014-11-17 19:53 344 查看
题目:

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given

s =
"catsanddog"
,

dict =
["cat", "cats", "and", "sand", "dog"]
.

A solution is
["cats and dog", "cat sand dog"]
.
题目来源:https://oj.leetcode.com/problems/word-break-ii/

解题思路:用f[i][j]表示s[i,j)在字典中,然后当遍历一遍字符串s后,从最后一列开始找f[i][s.size()]=1的值,即是可以分割的字符串。用深搜从i找到第0个字符,就能够得到一个被空格分隔的字符串。

#include<iostream>
#include<string>
#include<vector>
#include<unordered_set>
using namespace std;

void wordBreak(string s,int first,int last,unordered_set<string> &dict,vector<vector<bool> >&f,vector<string>&results,string &result)
{
if(last==0)
{
result.pop_back();//删除最后的空格
results.push_back(result);
return ;
}
for(int i=first;i<=last;i++)
{
if(f[i][last]==true)
{
string temp=result;
result.insert(result.begin(),1,' ');
result.insert(result.begin(),s.begin()+i,s.begin()+last);

wordBreak(s,0,i,dict,f,results,result);
result=temp;
}
}
}

vector<string> wordBreak(string s, unordered_set<string> &dict)
{
vector<vector<bool> >f(s.size()+1,vector<bool>(s.size()+1,false));
vector<bool> v(s.size()+1,false);
v[0]=true;
f[0][0]=true;
for(int i=1;i<=s.size();i++)
{
for(int j=i-1;j>=0;j--)
{
if(v[j] && dict.find(s.substr(j,i-j))!=dict.end())
{
v[i]=true;
f[j][i]=true;
}
}
}
vector<string>results;
string result;
wordBreak(s,0,s.size(),dict,f,results,result);
return results;
}

int main()
{
string A[]={"cat", "cats", "and", "sand", "dog"};
unordered_set<string> dict(A,A+5);
string s="catsanddog";
vector<string> result=wordBreak(s,dict);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: