在这段代码中,使用unordered_set<string>存储wordDict中的单词是为了实现快速的查找操作。下面是set、unordered_set和vector之间的区别:
- Set(集合):
-
- Set 是有序的容器,其中不允许重复的元素。
- 查找元素的时间复杂度为 O(log n)。
- 适用于需要有序存储且不允许重复元素的情况。
- Unordered_set(无序集合):
-
- Unordered_set 是无序的容器,其中不允许重复的元素。
- 查找元素的时间复杂度为平均 O(1),最坏情况下可达到 O(n)。
- 适用于不需要有序存储但需要快速查找元素的情况。
- Vector(向量):
-
- Vector 是有序的动态数组,允许重复元素。
- 查找元素的时间复杂度为 O(n)。
- 适用于需要按照插入顺序存储元素,且随机访问元素的情况。
在这段代码中选择使用unordered_set<string>而不是vector或set的原因是,动态规划算法需要频繁地查找一个字符串是否存在于wordDict中,并且不要求有序性,因此选择使用无序集合unordered_set可以在平均情况下以常数时间内完成查找操作,从而提高算法的效率。相比之下,使用set会引入对元素的自动排序,而使用vector则会导致查找操作的时间复杂度变为O(n),效率较低。
综上所述,根据具体需求来选择数据结构是很重要的,无序集合unordered_set适合需要快速查找、不需要有序性的场景。
相当于两个true确定一个单词是否在字典中,这题有点绕
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
//创建了一个名为wordDictSet的无序集合(unordered_set)
//()表示创建了一个空的无序集合,
auto wordDictset=unordered_set<string>();
for(auto word:wordDict)
wordDictset.insert(word);
//dp[i] 表示s的前i位是否可以用wordDict中的单词表示
auto dp=vector<bool>(s.size()+1,false);
dp[0]=true;
//i遍历字符串的所有子串
for(int i=1;i<=s.size();i++)//表示长度,判l.le.lee.leet.....
for(int j=0;j<i;j++)
{//然后j判断被i分解字符串,看截取多大长度能在s中找到
if(dp[j]&&wordDictset.find(s.substr(j,i-j))!=wordDictset.end())
dp[i]=true;//substr(起始位置,长度)
}
return dp[s.size()];}};