1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public boolean closeStrings(String word1, String word2) { if (word1.length() != word2.length()) { return false; } Map<Character, Integer> letterCountWord1 = new TreeMap<>(); Map<Character, Integer> letterCountWord2 = new TreeMap<>(); for (char letter : word1.toCharArray()) { letterCountWord1.put(letter, letterCountWord1.getOrDefault(letter, 0) + 1); } for (char letter : word2.toCharArray()) { letterCountWord2.put(letter, letterCountWord2.getOrDefault(letter, 0) + 1); } List<Character> word1LetterList = new ArrayList<>(letterCountWord1.keySet()); List<Character> word2LetterList = new ArrayList<>(letterCountWord2.keySet()); if (word1LetterList.size() != word2LetterList.size()) { return false; } Collections.sort(word1LetterList); Collections.sort(word2LetterList); for (int i = 0; i < word1LetterList.size(); i++) { if (word1LetterList.get(i) != word2LetterList.get(i)) { return false; } } List<Integer> word1Freq = new ArrayList<>(letterCountWord1.values()); List<Integer> word2Freq = new ArrayList<>(letterCountWord2.values()); Collections.sort(word1Freq); Collections.sort(word2Freq); for (int i = 0; i < word1Freq.size(); i++) { if (!word1Freq.get(i).equals(word2Freq.get(i))) { return false; } } return true; } }
|
这道题的思路是两个word的character set的要一样(每个word中unique character是一样的). 同时计算每个character出现的频率. 这些频率构成的list也要一样. 也就是word1的频率list中的每个元素在word2的频率list都有对应相等的值.
第一种交换本质是这样的. 比如:
a: 5
b: 3
a出现5次, b出现3次. 一交换变成这样:
a: 3
b: 5
那其实第一种操作就是交换频率. 如果两个word的character set相同, 同时频率list也相同, 那通过适当的交换可以让两个word的每个character的出现频率是一一对应一样的. 然后我们再通过第二个操作让实际的两个word每个位置的character一一对应相等即可.
时间复杂度: O(nlogn)
空间复杂度: O(n)