欢迎访问宙启技术站
智能推送

如何使用Java函数来判断两个字符串是否为Anagram(具有相同字母但顺序不同)?

发布时间:2023-12-11 11:36:37

判断两个字符串是否为Anagram,可以通过以下几种方法实现。

## 方法1:排序法

该方法的思路是,将两个字符串分别按照字母顺序进行排序,然后比较两个排序后的字符串是否相等。如果相等,则说明两个字符串是Anagram。

import java.util.Arrays;

public class AnagramChecker {

    public static boolean isAnagram(String str1, String str2) {
        // 如果字符串长度不相等,说明不可能是Anagram
        if (str1.length() != str2.length()) {
            return false;
        }
        
        // 将字符串转为字符数组并进行排序
        char[] charArray1 = str1.toCharArray();
        char[] charArray2 = str2.toCharArray();
        Arrays.sort(charArray1);
        Arrays.sort(charArray2);
        
        // 比较排序后的字符数组是否相等
        return Arrays.equals(charArray1, charArray2);
    }

    public static void main(String[] args) {
        String str1 = "listen";
        String str2 = "silent";
        
        if (isAnagram(str1, str2)) {
            System.out.println(str1 + " and " + str2 + " are anagrams.");
        } else {
            System.out.println(str1 + " and " + str2 + " are not anagrams.");
        }
    }
}

## 方法2:哈希表法

该方法的思路是,使用一个哈希表记录 个字符串中每个字母出现的次数,然后遍历第二个字符串,将每个字母在哈希表中的计数减一。如果最终计数都为零,则说明两个字符串是Anagram。

import java.util.HashMap;
import java.util.Map;

public class AnagramChecker {
    
    public static boolean isAnagram(String str1, String str2) {
        // 如果字符串长度不相等,说明不可能是Anagram
        if (str1.length() != str2.length()) {
            return false;
        }
        
        // 使用哈希表记录每个字母出现的次数
        Map<Character, Integer> charCount = new HashMap<>();
        for (char c : str1.toCharArray()) {
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }
        
        // 遍历第二个字符串,将每个字母在哈希表中的计数减一
        for (char c : str2.toCharArray()) {
            if (!charCount.containsKey(c)) {
                return false;
            }
            int count = charCount.get(c);
            if (count == 0) {
                return false;
            }
            charCount.put(c, count - 1);
        }
        
        return true;
    }

    public static void main(String[] args) {
        String str1 = "listen";
        String str2 = "silent";
        
        if (isAnagram(str1, str2)) {
            System.out.println(str1 + " and " + str2 + " are anagrams.");
        } else {
            System.out.println(str1 + " and " + str2 + " are not anagrams.");
        }
    }
}

## 方法3:字符计数数组法

该方法的思路是,使用一个长度为26的整型数组,分别统计两个字符串中每个字母出现的次数。然后比较两个整型数组是否相等,如果相等,则说明两个字符串是Anagram。

public class AnagramChecker {
    
    public static boolean isAnagram(String str1, String str2) {
        // 如果字符串长度不相等,说明不可能是Anagram
        if (str1.length() != str2.length()) {
            return false;
        }
        
        // 使用整型数组记录每个字母出现的次数
        int[] charCount = new int[26];
        
        // 统计      个字符串中每个字母出现的次数
        for (char c : str1.toCharArray()) {
            charCount[c - 'a']++;
        }
        
        // 遍历第二个字符串,将每个字母在数组中的计数减一
        for (char c : str2.toCharArray()) {
            if (charCount[c - 'a'] == 0) {
                return false;
            }
            charCount[c - 'a']--;
        }
        
        return true;
    }
    
    public static void main(String[] args) {
        String str1 = "listen";
        String str2 = "silent";
        
        if (isAnagram(str1, str2)) {
            System.out.println(str1 + " and " + str2 + " are anagrams.");
        } else {
            System.out.println(str1 + " and " + str2 + " are not anagrams.");
        }
    }
}

以上是三种判断两个字符串是否为Anagram的方法,分别是排序法、哈希表法和字符计数数组法,根据实际情况选择适合的方法即可。