【发布时间】:2015-05-12 13:40:43
【问题描述】:
问题是:给定一个字符串 s 和一个单词字典 dict,确定 s 是否可以分割成一个或多个字典单词的空格分隔序列。
例如,给定 s = "这里", dict = ["hi", "there"].
返回true,因为“hithere”可以被分割为“leet code”。
我的实现如下。此代码适用于正常情况。但是,它会因以下输入而受到很大影响:
s = "aaaaaaaaaaaaaaaaaaaaaaab", dict = {"aa", "aaaaaa", "aaaaaaaa"}。
我想记住处理过的子字符串,但是我做错了。关于如何改进的任何建议?非常感谢!
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
int len = s.size();
if(len<1) return true;
for(int i(0); i<len; i++) {
string tmp = s.substr(0, i+1);
if((wordDict.find(tmp)!=wordDict.end())
&& (wordBreak(s.substr(i+1), wordDict)) )
return true;
}
return false;
}
};
【问题讨论】:
-
您没有使用动态规划。您已经实现了天真的蛮力解决方案。
-
请注意,无论具体实现如何,您始终可以通过消除复合词来修剪字典。由于
aaaaaa是复合词aa-aa-aa,aaaaaaaa也是复合词,您可以将字典缩减为仅aa。在一个非常聪明的方法中,您可以动态发现这样的复合词(即当复合词第一次出现在输入字符串中时)。
标签: c++ dynamic-programming word-break