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*