给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。c++实现
时间: 2024-11-20 08:34:27 浏览: 14
给定这个问题,我们需要编写一个 C++ 函数来检查一个字符串 `s` 是否能通过从字典 `wordDict` 中选择单词并添加空格进行分割。函数的基本思路是遍历字符串,每看到一个单词就查找字典,如果找到则继续搜索,直到遍历完整个字符串。以下是 C++ 的解决方案:
```cpp
#include <unordered_set>
#include <vector>
#include <string>
bool canFormWords(std::string s, std::vector<std::string>& wordDict) {
std::unordered_set<std::string> dict(wordDict.begin(), wordDict.end());
std::string current_word = "";
bool found_dict_words = false;
for (char c : s) {
if (isalpha(c)) { // 如果是字母字符
current_word += tolower(c); // 转为小写累加到当前单词
} else if (!current_word.empty()) { // 遇到空格或其他非字母字符
if (dict.find(current_word) != dict.end()) {
found_dict_words = true;
}
current_word = ""; // 重置当前单词
}
}
// 最后处理一下字符串结尾是否有单词的情况
if (!current_word.empty() && dict.find(current_word) != dict.end()) {
found_dict_words = true;
}
return found_dict_words;
}
```
在这个函数中,我们首先将字典转换成无序集合以加快查找速度。然后逐个遍历字符串`s`,当遇到空格时检查当前构建的单词是否在字典中。如果找到,则标记`found_dict_words`为`true`。遍历结束后,检查最后一个单词是否有效。
阅读全文