我正在通过这个问题的leetcode:https://leetcode.com/problems/determine-if-two-strings-are-close/solutions/935916/c-o-nlogn-sort-hash-table-easy-to-understand/
class Solution {
public:
bool closeStrings(string word1, string word2) {
if(word1.size()!=word2.size())
return false;
int n = word1.size();
vector<int>freq1(26,0);
vector<int>freq2(26,0);
for(int i= 0 ; i < n ; ++i){
freq1[word1[i]-'a']++;
freq2[word2[i]-'a']++;
}
sort(freq1.rbegin(),freq1.rend());
sort(freq2.rbegin(),freq2.rend());
**if(set(word1.begin(),word1.end())!=set(word2.begin(),word2.end()))**
return false;
for(int i= 0;i<26;++i){
if(freq1[i]!=freq2[i])
return false;
}
return true;
}
};
我不明白set(word1.begin(),word1.end())
在这里是什么意思,我试着在网上搜索答案,但我没有得到任何满意的答案,如果有人能解释这将是非常有帮助的。提前感谢!
3条答案
按热度按时间nnvyjq4y1#
它创建了
word1
中的字符的set
,这只是唯一的字符,并且可以在某种程度上与另一个单词进行比较,而不需要出现的次数或顺序。因此,比较这样构成的集合,“cat”和“taca”会有
==
集合,“cat”和“taco”不会,“cat”和“kat”不会,但“dog”和“good”会。所以,这段代码是说,如果单词不共享所有相同的字母,那么它们就不会被认为是 close。
rqmkfv5c2#
word1.begin()
是指向字符串word1
中第一个字符的迭代器。word1.end()
是指向字符串word1
中最后一个字符之后的位置的迭代器。它们一起定义字符串word1
中将添加到std::set
对象的元素的范围。set(word1.begin(),word1.end())
会建立缓存std::set
对象,其中包含字串word1
中的所有字符。std::set
是以特定顺序存储 unique 元素的容器。在这种情况下,std::set
对象将以特定顺序包含字符串word1
中的所有唯一字符。然后将该
std::set
对象与另一个从字符串word2
创建的临时std::set
对象进行比较,以查看两组字符是否相等。如果不相等,则意味着两个字符串不具有相同的唯一字符集,该函数将返回false。fjaof16o3#
字符串可以看作是
char
的容器,因此可以为它们定义迭代器(按顺序逐个字符访问它们)。word1.begin()
和word1.end()
只是到字符串的第一个字符和结尾的迭代器。其他容器通常可以使用迭代器对(开始,end)来初始化,因此
set(word1.begin(),word1.end())
表示字符串中的一个std::set<char>
。因此,在if
语句中,您比较两个字符串是否包含相同的字符(但可能多次且顺序不同)。