c++ set(str.开始(),str.end())是什么意思?

cpjpxq1n  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(136)

我正在通过这个问题的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())在这里是什么意思,我试着在网上搜索答案,但我没有得到任何满意的答案,如果有人能解释这将是非常有帮助的。提前感谢!

nnvyjq4y

nnvyjq4y1#

它创建了word1中的字符的set,这只是唯一的字符,并且可以在某种程度上与另一个单词进行比较,而不需要出现的次数或顺序。
因此,比较这样构成的集合,“cat”和“taca”会有==集合,“cat”和“taco”不会,“cat”和“kat”不会,但“dog”和“good”会。
所以,这段代码是说,如果单词不共享所有相同的字母,那么它们就不会被认为是 close

rqmkfv5c

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。

fjaof16o

fjaof16o3#

字符串可以看作是char的容器,因此可以为它们定义迭代器(按顺序逐个字符访问它们)。word1.begin()word1.end()只是到字符串的第一个字符和结尾的迭代器。
其他容器通常可以使用迭代器对(开始,end)来初始化,因此set(word1.begin(),word1.end())表示字符串中的一个std::set<char>。因此,在if语句中,您比较两个字符串是否包含相同的字符(但可能多次且顺序不同)。

相关问题