这种类型的题目,由于我们需要判断各种子串长度时剩余的子串是否在字典中可拼,因而可能会多次需要判断每个子串是否可拼。 单纯的搜索递归肯定比较浪费时间,会超时。 借鉴了其他人的思路,选择了冻柜来解决这个问题。dp[i]代表了从i位置开始的s的子串是否符合要求。 我们只需要从n-1到0判断dp[i]的bool值即可。 在每次判断中要求能从dict中找到一个word保证s从i开始长为word.size()的子串和word相同且dp[i+word.size()]为true即可。注意word要小于剩余子串的长度,可以利用这点来剪枝。
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
bool dp[1001];
memset( dp,false,sizeof(dp));
int l1 = s.size();
dp[l1] = true;
for( int i=l1-1;i>=0;i-- )
{
int ls = l1-i;
for( unordered_set<string>::iterator it = dict.begin(); it != dict.end(); it++ )
{
int ldict = it->size();
if( ls>=ldict && dp[i] == false )
{
if(dp[i+ldict]==true && s.substr(i,ldict) == *it )
{
dp[i] = true;
break;
}
}
}
}
return dp[0];
}
};