本文主要是介绍有效的变位词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如果哈希表的键的取值范围是固定的,并且范围不是很大,则可以用数组来模拟哈希表。数组的下标和哈希表的键相对应,而数组的值和哈希表的值相对应。
英文小写字母只有26个,因此可以用一个数组来模拟哈希表。
class Solution {public boolean isAnagram(String s, String t) {if(s.length() != t.length() || s.equals(t))return false;int[] arr = new int[26];for (char ch : s.toCharArray()){arr[ch - 'a']++;} for (char ch : t.toCharArray()){arr[ch - 'a']--;}for (int a : arr){if(a != 0)return false;}return true;}
}
当然也可以用排序的方法做:首先判断字符串是否相等、长度是否不一致,如果相等或者长度不一致则直接返回 false,反之则继续判断两个字符串排序后是否相等。我们可以对字符串s和t分别排序,看排序后的字符串是否相等。
class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length() || s.equals(t)) {return false;}char[] str1 = s.toCharArray();char[] str2 = t.toCharArray();Arrays.sort(str1);Arrays.sort(str2);return Arrays.equals(str1, str2);}
}
一个unicode字符长度为16位,可以表示65536个字符。当然可以继续用长度为65536的数组来模拟哈希表,不过不建议,有点浪费内存。
此时可以使用真正的哈希表Hashmap。
class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length() || s.equals(t)) {return false;}Map<Character, Integer> counts = new HashMap<>();for (char ch : s.toCharArray()) {counts.put(ch, counts.getOrDefault(ch, 0) + 1);}for (char ch : t.toCharArray()) {if (!counts.containsKey(ch) || counts.get(ch) == 0){return false;}counts.put(ch,counts.get(ch) - 1);}return true;}
}
这篇关于有效的变位词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!