题目来源:链接: [https://leetcode-cn.com/problems/groups-of-special-equivalent-strings/].
893. 特殊等价字符串组
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,题目读了半小时都没读懂。。。)
等我健完身回来补充。。。
我的方案为空。。。
很尴尬。。。
我肥来啦~
题目分析(这道题的题目真的难懂,麻蛋!!!):
-
如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是特殊等价的。意思就是: 找所有字符串,所含字母一样的字符串。
-
一次移动包括选择两个索引 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