Leetcode刷题47-893. 特殊等价字符串组(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/groups-of-special-equivalent-strings/].

1.问题描述

你将得到一个字符串数组 A。

如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是特殊等价的。

一次移动包括选择两个索引 i 和 j,且 i%2 == j%2,并且交换 S[j] 和 S [i]。

现在规定,A 中的特殊等价字符串组是 A 的非空子集 S,这样不在 S 中的任何字符串与 S 中的任何字符串都不是特殊等价的。

返回 A 中特殊等价字符串组的数量。

示例1:

输入:["a","b","c","a","c","c"]
输出:3
解释:3 组 ["a","a"],["b"],["c","c","c"]

示例2:

输入:["aa","bb","ab","ba"]
输出:4
解释:4 组 ["aa"],["bb"],["ab"],["ba"]

示例3:

输入:["abc","acb","bac","bca","cab","cba"]
输出:3
解释:3 组 ["abc","cba"],["acb","bca"],["bac","cab"]

示例4:

输入:["abcd","cdab","adcb","cbad"]
输出:1
解释:1 组 ["abcd","cdab","adcb","cbad"]

说明:

1. 1 <= A.length <= 1000
2. 1 <= A[i].length <= 20
3. 所有 A[i] 都具有相同的长度。
4. 所有 A[i] 都只由小写字母组成。

2.我的解决方案

easy 类型题目 (并不easy,题目读了半小时都没读懂。。。)
等我健完身回来补充。。。
我的方案为空。。。
很尴尬。。。

我肥来啦~
题目分析(这道题的题目真的难懂,麻蛋!!!):

  1. 如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是特殊等价的。意思就是找所有字符串,所含字母一样的字符串。

  2. 一次移动包括选择两个索引 i 和 j,且 i%2 == j%2,并且交换 S[j] 和 S [i]。意思就是找其中奇数位一样的字符串(或者偶数位)。

3.大神们的解决方案

**参考的大神修改的代码如下:

class Solution {
public:
    int numSpecialEquivGroups(vector<string>& A) {
        set<string> res;
        for(auto &s : A)
        {
            string odd, even;
            for(int i = 0; i < s.size(); i=i+2)
            {
                odd.push_back(s[i]);           //求偶数位的字符
            }
            for(int j = 1; j < s.size(); j=j+2)
            {
                even.push_back(s[j]);			//求奇数位的字符
            }
            sort(odd.begin(), odd.end());       //排序
            sort(even.begin(), even.end());
            res.insert(odd + even);             //如果排完序之后的字符串重复,使用set容器过滤掉
        }
        return res.size();
    }
};

4.我的收获

4.1 set的用法

参考博文:Set的用法介绍
1.基本含义:set是STL中一种标准关联容器:它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。
2.set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列
3.set 支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。

使用时注意包含头文件 std::set and std::multiset associative containers

s.begin()      返回set容器的第一个元素
s.end()    	返回set容器的最后一个元素
s.clear()       删除set容器中的所有的元素
s.empty()     判断set容器是否为空
s.insert()      插入一个元素
s.erase()       删除一个元素
s.size()     返回当前set容器中的元素个数

set容器的增删改查具体用法请参考上面的播客。

4.2 map容器和multimap容器

详细介绍请参考博文:C++ map容器和multimap容器

2019/4/6 胡云层 于南京 47

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/89056453