c_cpp 给定一个字符串s和一个单词字典dict,确定s是否可以被分割成一个或多个字典的空格分隔序列w
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定一个字符串s和一个单词字典dict,确定s是否可以被分割成一个或多个字典的空格分隔序列w相关的知识,希望对你有一定的参考价值。
// DFS solution
bool dfs(string s, unordered_set<string> &dict, int start_idx) {
if(start_idx >= s.size()) return true;
for(int j=start_idx; j<s.size(); j++) {
string t = s.substr(start_idx, j-start_idx+1);
if(dict.find(t) == dict.end()) continue;
if(dfs(s, dict, j+1)) return true;
}
return false;
}
bool wordBreak(string s, unordered_set<string> &dict) {
return dfs(s, dict, 0);
}
// DP solution. Note, the indices are hard to understand in some sense! Be very careful!
bool word_break_DP(string s, unordered_set<string> &dict) {
if(s.empty()) return true;
if(dict.empty()) return false;
vector<bool> F(s.size()+1, false);
F[0] = true;
for(int i=1; i<=s.size()+1; i++) {
for(int j=i-1; j>=0; j--) {
// 为何是f[j] 而不是f[j-1]? 因为f的长度是s.size()+1, f[j]指的是从0到j-1的字符串的bool值
if(F[j] && dict.find(s.substr(j, i-j)) != dict.end())
F[i] = true;
break;
}
}
return F[s.size()];
}
以上是关于c_cpp 给定一个字符串s和一个单词字典dict,确定s是否可以被分割成一个或多个字典的空格分隔序列w的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp [bfs] [string]字梯。给定两个单词(开头和结尾)和一个字典,从星上找到最短变换序列的长度
2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你
2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
leetcode 820. 单词的压缩编码(字典树)
leetcode139.单词拆分
LeetCode——word-break-ii*