Problem: 1657. 确定两个字符串是否接近
题目
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
操作 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”
思路
分析一下,就是统计两个字符串满足下面两个条件就可以
(1) 存在的字符一致
(2) 字符的个数一致,比如 “aaabbbbccddeeeeefffff” 3 4 2 2 5 5
“aaaaabbcccdddeeeeffff” 5 2 3 3 4 4
串1 中a有3个,b有4个,c有2个,。。。只要保证个数是一致的,字符无所谓。
解题方法
第一个条件用set维护,第二个条件用数组统计+排序比较。
Code
class Solution {
public:
bool closeStrings(string word1, string word2) {
// 将子串中满足
int n1 = word1.size() ;
int n2 = word2.size() ;
if(n1!=n2) return false ;
// 统计是否存在的字符一致
vector<int> w1(26) ;
vector<int> w2(26) ;
set<char> y1;
set<char> y2;
for(int i = 0; i <n1 ; i++ ) {
y1.insert(word1[i]) ;
y2.insert(word2[i]) ;
w1[word1[i]-'a']++ ;
w2[word2[i]-'a']++ ;
}
vector<int> s1 ;
vector<int> s2 ;
for(int i = 0 ; i<26 ; i++ ) {
int count_word1 = w1[i] ;
int count_word2 = w2[i] ;
s1.push_back(count_word1) ;
s2.push_back(count_word2) ;
}
// 看两个集合是否一样
// "aaabbbbccddeeeeefffff" 3 4 2 2 5 5
// "aaaaabbcccdddeeeeffff" 5 2 3 3 4 4
sort(s1.begin() ,s1.end()) ;
sort(s2.begin() ,s2.end()) ;
if(s1.size() != s2.size()) return false ;
for(int i = 0 ; i<s1.size() ; i++ ) {
if(s1[i] !=s2[i]) return false ;
}
return y1 ==y2 ;
}
};