Java函数:如何判断两个字符串是否为Anagram(字母异位词)?
字母异位词指的是由相同字母构成但排列顺序不同的两个单词或者短语。例如,“listen”和“silent”就是字母异位词。这种问题可以用各种编程语言来解决,我们可以通过编写一个Java函数来判断两个字符串是否为Anagram,下面是一些常见的实现方式:
1. 暴力法:
最直接的方法就是将两个字符串按字母排序,并判断它们是否相同。首先,我们将两个字符串转换成字符数组;然后使用Java的Arrays类对这些字符数组进行排序;最后,我们可以使用Arrays类的equals()方法来检查两个排序后的数组是否相同。以下是Java代码示例:
public static boolean isAnagram(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
char[] char1 = str1.toCharArray();
char[] char2 = str2.toCharArray();
Arrays.sort(char1);
Arrays.sort(char2);
return Arrays.equals(char1, char2);
}
2. 哈希表:
另一种方法是使用哈希表,通过记录每个字符在字符串中出现的次数来检查它们是否是Anagram。首先,我们需要一个HashMap用于存储字符和它们的出现次数。然后遍历 个字符串并在HashMap中添加每个字符及其出现次数。接着,我们遍历第二个字符串并检查每个字符是否在HashMap中出现过,并且出现的次数是否相等。以下是Java代码示例:
public static boolean isAnagram(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < str1.length(); i++) {
char c1 = str1.charAt(i);
if (map.containsKey(c1)) {
map.put(c1, map.get(c1) + 1);
} else {
map.put(c1, 1);
}
}
for (int i = 0; i < str2.length(); i++) {
char c2 = str2.charAt(i);
if (!map.containsKey(c2)) {
return false;
} else {
map.put(c2, map.get(c2) - 1);
if (map.get(c2) == 0) {
map.remove(c2);
}
}
}
return map.isEmpty();
}
3. 计数排序:
一种更高效的实现方法是使用计数排序。我们可以定义一个长度为26的整数数组(因为英文字母只有26个),然后遍历 个字符串并增加与每个字符关联的计数器。然后,我们遍历第二个字符串并减少相应的计数器。最后,如果所有计数器的值都为零,则两个字符串为Anagram。以下是Java代码示例:
public static boolean isAnagram(String str1, String str2) {
if (str1.length() != str2.length()) {
return false;
}
int[] count = new int[26];
for (int i = 0; i < str1.length(); i++) {
count[str1.charAt(i) - 'a']++;
}
for (int i = 0; i < str2.length(); i++) {
count[str2.charAt(i) - 'a']--;
if (count[str2.charAt(i) - 'a'] < 0) {
return false;
}
}
return true;
}
总结:
这些方法在时间和空间复杂度上有所不同,但它们都可以有效解决判断两个字符串是否为Anagram的问题。开发者可以根据实际需要选择适当的实现方法。
