LeetCode242 ValidAnagram
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解答
解法一:两个map
用两个map来解决,key记录字母,value记录字母出现的次数。再比较这两个map是否相等。
ps:可以首先判断这两个字符串是不是长度相等,若是不相等,直接就可以返回false了。
private static boolean solve(String s, String t){
int length1 = s.length();
int length2 = t.length();
if (length1!=length2)
return false;
Map<Character,Integer> map1 = new HashMap<>();
Map<Character,Integer> map2 = new HashMap<>();
for (int i=0; i<length1;i++){
int count = map1.getOrDefault(s.charAt(i), 0);
map1.put(s.charAt(i),count+1);
int count2 = map2.getOrDefault(t.charAt(i), 0);
map2.put(t.charAt(i),count2+1);
}
//hsahmap的equals方法:先判断是否是同一个引用,然后再调用其父类AbstractMap中的equals方法来判断(是否同一个引用,是否是内容相同)。
return map1.equals(map2);
}
解法二:用数组来代替map
用数组来解决,因为说了只包含小写字母,所以数组大小只需要26个。字母本身的ascii码作为下标,因为下标都是从0开始,所以每次下标都是s.charAt(i)-‘a’,数组的元素是该下标字母出现的次数。
然后比较两个数组是否相等,可以使用Arrays类里面的equals方法。
private static boolean solve2(String s, String t){
int length1 = s.length();
int length2 = t.length();
if (length1!=length2)
return false;
int[] count = new int[26];
for (int i=0; i<length1;i++){
count[s.charAt(i)-'a']++;
count[t.charAt(i)-'a']--;
}
for (int aCount : count) {
if (aCount != 0)
return false;
}
return true;
}
解法三:利用一个数组
利用一个数组来存放字符串a出现的次数,然后遍历字符串2,对于每个字符,将数组中的对应值进行减减操作,当某个值小于0时直接返回false。
private static boolean solve3(String s, String t){
int length1 = s.length();
int length2 = t.length();
if (length1!=length2)
return false;
int[] count = new int[26];
for (int i=0; i<length1;i++){
count[s.charAt(i)-'a']++;
}
for (int i=0; i<length2;i++){
count[t.charAt(i)-'a']--;
if (count[t.charAt(i)-'a']<0)
return false;
}
return true;
}
解法四:排序
将字符串按照字典序排序,可以先转化为字符数组,再利用Arrays类里面的sort函数来排序。然后比较两个数组是否相等。
private static boolean solve4(String s, String t){
int length1 = s.length();
int length2 = t.length();
if (length1!=length2)
return false;
char[] array1 = s.toCharArray();
char[] array2 = t.toCharArray();
Arrays.sort(array1);
Arrays.sort(array2);
return Arrays.equals(array1,array2);
}