[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 =
dict =
Return true because
对原题的完全理解是由于有几个case没过,这里提供一下帮助理解题意。
对s中当前尚未匹配的第一个字母,在vdict中逐个单词对比,看是否可以匹配,匹配成功则保存此字母的index以及单词的指针itr(通过栈保存);如果遍历vdict所有单词后都未匹配成功,说明上一个匹配成功的单词不合适,需要退栈,弹出上一次匹配成功的单词和index,对此index重新匹配其他单词。AC代码:
直接用递归做了一下,思路跟上面一样,只不过采用了DFS,但是超时了
代码如下:
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; } };
相关文章推荐
- leetcode 139. Word Break
- LeetCode——Word Break
- LeetCode 139. Word Break
- leetcode 148: Word Break
- Word Break - Leetcode
- [LeetCode] Word Break, Solution
- Leetcode -- Word Break
- Leetcode: Word Break
- [Leetcode] Word Break
- LeetCode 139. Word Break
- [Leetcode]Word Break
- [leetcode 139]Word Break
- LeetCode - Word Break
- LeetCode 139 Word Break
- [LeetCode]Word Break
- [leetcode 139] Word Break
- Leetcode: Word Break
- [leetcode]Word Break
- LeetCode | Word Break
- leetcode笔记:Word Break