您的位置:首页 > 其它

[LeetCode] Word Break

2014-10-12 21:54 411 查看
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"
.

对原题的完全理解是由于有几个case没过,这里提供一下帮助理解题意。

Input:	"bb", ["a","b","bbb","bbbb"]
Output:	false
Expected:	true
Input:	"abcd", ["a","abc","b","cd"]
Output:	false
Expected:	true

对s中当前尚未匹配的第一个字母,在vdict中逐个单词对比,看是否可以匹配,匹配成功则保存此字母的index以及单词的指针itr(通过栈保存);如果遍历vdict所有单词后都未匹配成功,说明上一个匹配成功的单词不合适,需要退栈,弹出上一次匹配成功的单词和index,对此index重新匹配其他单词。AC代码:

class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
vector<string> vdict;//set转换为vector做一个排序
for (unordered_set<string>::iterator vitr = dict.begin(); vitr!=dict.end(); vitr++)vdict.push_back(*vitr);
sort(vdict.begin(), vdict.end());

vector<int> iIndex;//用于记忆分割成word在s中的首字母位置
vector<vector<string>::iterator > iSet;//用于记忆上一次查找到的vdict位置

int i = 0;
bool popfg = false;
while (i < s.size())
{
vector<string>::iterator itr = vdict.begin();
if (popfg)
{
itr = iSet.back()+1;
if (itr == vdict.end())return false;
iSet.pop_back();
popfg = false;
}//itr默认从头开始,如果上轮有退栈,从退出单词的itr开始
for (; itr!=vdict.end(); itr++)
{
int itrSize = (*itr).size();
string sCut = s.substr(i, itrSize);
if (!strcmp(sCut.c_str(), (*itr).c_str()))
{
iIndex.push_back(i);
iSet.push_back(itr);
i += itrSize;
break;
}
}
if (itr==vdict.end())//本轮没有找到,出栈
{
if (iIndex.size()==0)return false;
i = iIndex.back();
iIndex.pop_back();
popfg = true;
}
}//while
return true;
}
};


直接用递归做了一下,思路跟上面一样,只不过采用了DFS,但是超时了

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) {
if (s.empty())return true;
bool bR = false;
for (unordered_set<string>::iterator vitr = dict.begin(); vitr != dict.end(); vitr++)
{
if (s.substr(0, (*vitr).size())==*vitr)
{
bR = wordBreak(s.substr((*vitr).size()), dict);
}
if (bR)return true;
}
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: