给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。使用c++
时间: 2024-10-01 07:04:32 浏览: 50
在C++中,你可以通过动态规划的方式来解决这个问题。这个问题是一个经典的“词频统计”或“单词搜索”的变种。你可以创建一个布尔数组dp,其中dp[i]表示是否可以用字典中的单词组成s从0到i的子串。下面是基本思路:
1. 定义函数isPossible(s, start, end, wordDict),输入当前子串`s[start:end+1]`,起始位置`start`,结束位置`end`以及字典`wordDict`。
2. 初始化dp数组,dp[0] = true,因为一个空子串总是可以在字典中找到。
3. 遍历长度范围内的每个位置`i`,对于每个位置,检查是否存在字典中的单词,如果存在并且子串`s[start:i+1]`等于这个单词,则更新dp[i+1]为true。
4. 为了处理重复使用单词的情况,你需要记录下已经使用过的单词,用一个哈希集合或者映射存储。
5. 当遍历完整个字符串时,如果dp[n](n为s的长度)为真,那么s就可以由字典中的单词组成。
以下是伪代码形式的实现:
```cpp
bool isPossible(const string& s, unordered_set<string>& wordDict, int start, int end) {
if (start > end)
return true;
unordered_set<string> usedWords;
for (int i = start; i <= end; ++i) {
// 去除前缀并查找字典
string prefix = s.substr(start, i - start + 1);
if (wordDict.find(prefix) != wordDict.end() && !usedWords.count(prefix)) {
// 更新已使用的单词集合
usedWords.insert(prefix);
if (isPossible(s, start + prefix.size(), end, wordDict))
return true;
}
}
return false;
}
bool canFormSentence(string s, vector<string>& wordDict) {
unordered_set<string> dict(wordDict.begin(), wordDict.end());
return isPossible(s, 0, s.length() - 1, dict);
}
```
阅读全文