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 len = dict.size();
bool book[len+1];
book[0] = true;
int i = 1;
while (i<=dict.size())
{
int j = 0;
while (j<i)
{
string tmp = s.substr(j, i-j);
if (book[j] && dict.find(tmp)!=dict.end())
{
book[i] = true;
break;
}
j++;
}
i++;
}
return book[len];
}
};