问题描述
Given a non-empty string s and a dictionary wordDict containing a list
of non-empty words, determine if s can be segmented into a
space-separated sequence of one or more dictionary words.Note:
- The same word in the dictionary may be reused multiple times in the segmentation.
- You may assume the dictionary does not contain duplicate words.
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
思路
如图,分为两条序列,s为给定的字符串,f为判断字符串中分割出的字母是否在字典中的标志。如图,当f到达j位置时,我们只需要判断[j+1…i]这段子字符串是否在字典中即可。
整体思路整理下来就是,利用f序列,跳过已经分割好的子字符串,判断当前标记到字符串末尾的内容是否在字典中即可。
有一种情况是整个字符串s即为字典中的内容。因此,在s字符串前加一段空字符,作为f的第一个标记。
代码如下
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> dict(wordDict.cbegin(), wordDict.cend()); //将vector形式转换为字典型,提高检索效率
int n = s.length();
s = " " + s; // s[1...n]
vector<int> f(n+1, 0);
f[0] = 1;
for(int i=1;i<=n;++i)
for(int j=0;j<i;++j){
if(f[j] == 1){
const string new_s = s.substr(j+1, i-j); // s[j+1...i]
if(dict.count(new_s)){
f[i] = 1;
break;
}
}
}
return f[n];
}
};