Given a string s and a dictionary of words dict, determine ifs 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"
.
先写测试用例,再写代码!
{"abcde"} {"a"}/{"ab"}/{"abc","bcd","cde","aaaaaaaaaaa"}
{"aaaaaaa"} {"a"}
class Solution {
public:
unordered_map<int, bool>avail;
int maxlen;
bool wordBreak(string s, unordered_set<string> &dict) {
if(s.size() == 0 || dict.size() == 0)return false;
maxlen = 0;//可能同意个对象,调用多次这个函数
for(unordered_set<string>::iterator it = dict.begin(); it != dict.end(); ++it)
{
//cout <<*it;
if(it->size() > maxlen)maxlen = it->size();
}
return judge(0 , s, dict);
}
bool judge(int i,string s, unordered_set<string> &dict)
{
if(i == s.size())return true;
if(avail.find(i) != avail.end())return avail[i];
for(int len = 1; len <= maxlen && i + len <= s.size(); len++)//注意 i越界的情况
{
string str = s.substr(i, len);
if(dict.find(str) != dict.end())
{
bool rst = judge(i + len, s, dict);
if(rst)
{
avail[i] = true;
return true;
}
}
}
avail[i] = false;
return false;
}
};