題目鏈接及描述
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;}
}