标签:word break leetcode 动态规划 面试
Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s = "leetcode",
dict = ["leet", "code"].
Return true because "leetcode" can be segmented as "leet
code".
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict)
{
int length = s.size();
vector<bool> dp(length + 1,false);
dp[length] = true;
int i,j;
for(i = length - 1; i >= 0; --i)
{
for( j = i; j < length; ++j)
{
string sub = s.substr(i,j - i + 1);
unordered_set<string>::iterator iter = dict.find(sub);
if(iter != dict.end() && dp[j+1])
{
dp[i] = true;
}
}
}
return dp[0];
}
};
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"].
class Solution {
public:
void dfs(string s,unordered_set<string> &dict,string sub,vector<vector<bool> > seg,int start,int depth,int length,vector<string>& res)
{
if(depth == length)
{
string t = sub.substr(0,sub.length()-1);//去除最后一个空格
res.push_back(t);
return;
}
for(int len = 1;len <= length;len++)
{
if(seg[start][len])//判断是否可以完全分割
{
string t = s.substr(start,len);
unordered_set<string>::iterator iter = dict.find(t);
if(iter != dict.end())
{
int beforeLen = sub.length();
sub += t += " ";
dfs(s,dict,sub,seg,start+len,start+len,length,res);
sub = sub.substr(0,beforeLen);
}
}
}
}
vector<string> wordBreak(string s, unordered_set<string> &dict) {
<span style="white-space:pre"> </span>vector<string> res;
int length = s.size();
if(length == 0 || dict.size() == 0)return res;
int len,i,j;
int MIN_LEN = numeric_limits<int>::max();
unordered_set<string>::iterator iter = dict.begin();
for(;iter != dict.end();iter++)
{
if((*iter).size() < MIN_LEN)MIN_LEN = (*iter).size();//找到字典中的最短单词的长度
}
vector<vector<bool> > seg;//用来判断当前子串是否可以完全分割,减少递归次数
for(i=0;i<length;i++)
{
vector<bool> t;
for(j=0;j<length+1;j++)
{
t.push_back(false);
}
seg.push_back(t);
}
for(len = MIN_LEN;len <= length;len ++)
{
for(i=0;i + len <= length;i++)
{
string sub = s.substr(i,len);
iter = dict.find(sub);
if(iter != dict.end())
{
seg[i][len] = true;
continue;
}
for(j=1;j<len;j++)
{
if(seg[i][j] && seg[i+j][len-j])
{
seg[i][len] = true;
break;
}
}
}
}
if(seg[0][length] == false)return res;
string sub = "";
dfs(s,dict,sub,seg,0,0,length,res);
return res;
}
};标签:word break leetcode 动态规划 面试
原文地址:http://blog.csdn.net/fangjian1204/article/details/39102443