题目: 给定两个字符串s和t,请判断它们是不是一组变位词。在一组变位词中,它们的字符以及每个字符出现的次数都相同,但字符的顺序不能相同。例如,“anagram”和“nagaram”就是一组变位词。 分析: 如果只考虑英文小写字母,那就可以利用数组模拟哈希表,创建一个容量为26个英文字母大小的数组来存储每个字母出现的次数,先将第一组字符串按照对应位置分别将出现的次数存储在容量26的数组中,然后将第二组字符串按照自己在数组的对应位置减1,如果数组都为0相当于抵消了就一定是一组变位词,为了再加快程序,可以直接判断第二组字符在数组中对应的值是否为0,如果为0,则说明第二组字符串中的这个字符不存在第一组字符串中或这个字符出现的次数比第一组中的这个字符的次数少。 什么都考虑就直接利用HashMap就可以了,也是字符对应出现次数,思路和上一段类似。 代码:
import java.util.HashMap;
import java.util.Map;
public class IsAnagram {
public static boolean isAnagram1(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
int[] ints = new int[26];
for (char ch : str1.toCharArray()) {
ints[ch - 'a']++;
}
for (char ch : str2.toCharArray()) {
if (ints[ch - 'a'] == 0) {
return false;
}
ints[ch - 'a']--;
}
return true;
}
public static boolean isAnagram2(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
Map<Character, Integer> counts = new HashMap<>();
for (char ch : str1.toCharArray()) {
counts.put(ch, counts.getOrDefault(ch, 0) + 1);
}
for (char ch : str2.toCharArray()) {
if (!counts.containsKey(ch) || counts.get(ch) == 0) {
return false;
}
counts.put(ch, counts.get(ch) - 1);
}
return true;
}
}
|