确定两个字符串是否接近
1.题目链接
1657. 确定两个字符串是否接近
2.原题描述:
如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :
操作 1:交换任意两个 现有 字符。
例如,abcde -> aecdb
操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )
你可以根据需要对任意一个字符串多次使用这两种操作。
给你两个字符串,word1 和 word2 。如果 word1 和 word2 接近 ,就返回 true ;否则,返回 false 。
3.相关算法
排序:
如果两个字符串接近,那么它们的字符种类和字符出现次数都应该相同。因此,可以将两个字符串排序后比较是否相等。
哈希表:
可以使用哈希表统计每个字符串中字符出现的次数,然后比较两个哈希表是否相同。需要注意的是,两个字符串的字符种类必须相同,因此可以先统计两个字符串的字符种类,如果不同则直接返回false。
4.本题主要思路
本题使用排序来解题,创建两个大小为26的整形数组,将 a-z 26个英文字符对应数组的0-25下标,通过循环累加对应下标计数保存到数组中,记录完,通过判断相同下标中的数是否都存在或者都不存在,若不满足则返回false,最后将数组进行排序,排序完进行比较,当排序完后两数组相等则说明两个字符串接近,排序的原因是因为题目的第二种操作,可以将两个字符进行相互替换,只需要保证数量上的相等即可。
5.源码分析
class Solution {
public boolean closeStrings(String word1, String word2) {
if (word1.length() != word2.length()) { // 1
return false;
}
int[] count1 = new int[26]; // 2
int[] count2 = new int[26];
for (char c : word1.toCharArray()) { // 3
count1[c - 'a']++;
}
for (char c : word2.toCharArray()) {
count2[c - 'a']++;
}
for (int i = 0; i < 26; i++) {
if ((count1[i] == 0) != (count2[i] == 0)) { // 4
return false;
}
}
Arrays.sort(count1); // 5
Arrays.sort(count2);
return Arrays.equals(count1, count2); // 6
}
}
- 首先判断两个字符串的数量是否相等,若不相等则不可能接近,直接返回false;
- 创建两个整形数组,用下标对应英文字母进行数量的统计;
- for循环遍历字符串,统计各个字符的数量;
- 判断每个字符是否对应存在,当
word1中该字符存在word2中该字符不存在则返回false(判断该字符串是否满足操作1的要求); - 将字符串的数量进行排序,方便满足操作2的条件;
- 排序完后两个数组相等,返回结果true,否则返回false。