如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
操作 1:交换任意两个 现有 字符。 例如,
abcde
->aecdb
操作 2:将一个 现有 字符的每次出现转换为另一个 现有字符,并对另一个字符执行相同的操作。 例如,aacabb
->bbcbaa
(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1
和word2
。如果word1
和word2
接近 ,就返回true
;否则,返回false
。
示例 1:
输入:word1 = “abc”, word2 = “bca”
输出:true
解释:2 次操作从 word1 获得 word2 。
执行操作 1:“abc” -> “acb”
执行操作 1:“acb” -> “bca”
示例 2:
输入:word1 = “a”, word2 = “aa”
输出:false
解释:不管执行多少次操作,都无法从 word1 得到 word2 ,反之亦然。
示例 3:
输入:word1 = “cabbba”, word2 = “abbccc”
输出:true
解释:3 次操作从 word1 获得 word2 。
执行操作 1:“cabbba” -> “caabbb”
执行操作 2:“caabbb” -> “baaccc”
执行操作 2:“baaccc” -> “abbccc”
解题思路
观察示例可以得知:
①如果两个字符串长度不相等,肯定返回false;
②两个字符串去重后的元素必须相同; 比如示例1和示例3中都有abc
③两个字符串中的元素出现的次数,按序排列,必须相同; 因为只有这样才能通过两个操作完成题目要求
所以代码思路如下:
①先判断长度是否相等,不相等返回false
②去重,排序,本文使用set容器(自带排序去重),然后若不相等,则不符合第二个要求,所以返回false
③获取每个元素的出现次数,排序,这里使用multiset容器(自带排序),然后若完全相同,则返回true,否则不符合第三点,返回false
class Solution {
public:bool closeStrings(string word1, string word2) {//长度不同肯定falseif(word1.length()!=word2.length()){return false;} //去重set<char> w1;set<char> w2;for(int i=0;i<word1.length();i++){w1.insert(word1[i]);}for(int i=0;i<word2.length();i++){w2.insert(word2[i]);}if(w1!=w2){return false;}//获取出现次数multiset<int> ans1;multiset<int> ans2;for(int i:w1){int count=0;for(int j=0;j<word1.length();j++){if(i==word1[j]){count++;}}ans1.insert(count);}for(int i:w2){int count=0;for(int j=0;j<word2.length();j++){if(i==word2[j]){count++;}}ans2.insert(count);}return ans1==ans2;}
};