如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。 例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a ) 你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/de…
public class CloseString {
/**
* 题解:
* 1. 首先比较两个字符串的长度,如果长度不一致,再如何变化都是无用的;
* 2. 存在两类操作:一个是交换位置;一个是交换字符;
* 1. 如果两个都带有独特的字符,或者其中一个字符串中带有独特的字符,则无法使用上述两类操作完成接近;
* 2. 使用长度为26的数组,将两个字符串中的每个字符出现的次数记录下来;
* 3. 如果两个字符串中有独特的字符,则无法完成接近:判断标准为:在遍历数组时,相同位置为同一个字符,如果其中一个字符串对应的为0另外一个非0,则无法接近;
* 4. 将两个数组排序一下:
* 如果均相等,则可以完成接近;如果有一个不相等,则无法完成接近.
* @param word1
* @param word2
* @return
*/
public static boolean closeString(String word1, String word2) {
int[] count1 = new int[26];
int[] count2 = new int[26];
if (word1.length() != word2.length()) {
return false;
}
for (int i = 0; i < word1.length(); i++) {
count1[word1.charAt(i) - 'a'] += 1;
count2[word2.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < 26; i++) {
if ((count1[i] == 0 && count2[i] != 0) || (count1[i]!= 0 && count2[i] == 0)) {
return false;
}
}
Arrays.sort(count1);
Arrays.sort(count2);
for (int i = 0; i < 26; i++) {
if (count1[i] != count2[i]) {
return false;
}
}
return true;
}
}