您的位置:首页 > 其它

[LeetCode] Word Break

2014-07-07 17:02 302 查看
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"
.

方法一:

DFS,

start已知,当start超过str长度时,说明全部字符串都能找到了。。

小数据可过,大数据时超时

Submission Result: Time Limit Exceeded

Last executed input:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict)
{
return wordBreak(s,0, dict);
}

bool wordBreak(string s, int start, unordered_set<string> & dict)
{
size_t size =  s.size();
if(size == 0) return false;
if(start >= size)
return true;

for( int i = start; i <size; i++)
{
string str = s.substr(start, i-start+1);
if(dict.find(str) != dict.end())
{
if(wordBreak(s,i+1, dict))
return true;
}

}
return false;
}
};


方法二:

DP

设状态为 f(i),表示 s[0,i] 是否可以分词,则状态转移方程为
f(i) = any_of(f(j)&&s[j + 1, i] 2 dict), 0  j < i

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