题目链接及描述
1657. 确定两个字符串是否接近 - 力扣(LeetCode)
题目分析
今日看到这道题目,乍一看觉得非常熟悉,对于将一个字符串转换为另一个字符串的题目之前做过一些。分析题目,题目中所述就是两种操作:
- 将一个字符和另一个字符的位置交换。
- 对于两个个数不一样的字符,可以将字符A变为字符B,同时将字符B变为字符A。字符个数无所谓。
以上所述两种变换可以用一句话概括,对于一个字符串中的任意两种类型的字符,无论字符个数是否相同,都可以将类型A对应的字符变为类型B对应的字符,同时对类型B所对应的字符转换为类型A所对应的字符。【类型A的所有字符必须和类型B的所有字符对换,不管个数是否相同】
aacabb ----- 将a变为b,b变为a,字符对应的个数和位置保持不变-----> bbcbaa
由于字符具有传递性,所以任意字符都可以变换,上述a和b替换之后,a和c,b和c也可以替换。
基于上面分析,本题只要掌握以下两点就可以解决。
- word1中出现的字符必须在word2中出现(不讨论个数),word2中出现的字符必须在word1中出现=》word1和word2中所出现的字符必须相等,否则无论如何交换字符不可能创造新字符。
- word1中某个字符出现的次数 count 在word2中必须有对应的某个字符出现的次数也为 count。
能够分析出以上两点就可以构造map进行代码分别,map中的key为对应的字符ch,value为字符ch在字符串中出现的次数。
重点在于第二点如何实现,我的思路是构造好map之后,获取value构造一个int类型的数组,随后对数组进行升序排序,之后依序比较排序后的两个int数组的每一位元素是否相等,如果不等则不满足第2点,直接返回false,遍历完没有返回则此时返回true,能够实现题目要求。
代码编写
class Solution {public boolean closeStrings(String word1, String word2) {if(word1.length() != word2.length()){return false;}Map<Character, Integer> map1 = new HashMap<>();Map<Character, Integer> map2 = new HashMap<>();for(char ch : word1.toCharArray()){map1.put(ch, map1.getOrDefault(ch, 0) + 1);}for(char ch : word2.toCharArray()){if(!map1.containsKey(ch)){return false;}map2.put(ch, map2.getOrDefault(ch, 0) + 1);}if(map1.size() != map2.size()){return false;}int[] arr1 = new int[map1.size()];int[] arr2 = new int[map2.size()];int idx = 0;for(int cnts : map1.values()){arr1[idx++] = cnts;}idx = 0;for(int cnts : map2.values()){arr2[idx++] = cnts;}Arrays.sort(arr1);Arrays.sort(arr2);for(int i = 0; i < arr1.length; i++){if(arr1[i] != arr2[i]){return false;}}return true;}
}