簡體   English   中英

Java Anagram-它是除排序之外最簡單的解決方案

[英]Java Anagram - is it the simplest solution other than sorting

我正在創建一種算法來檢查兩個給定的單詞是否為Anagram。 我想出了這個簡單的解決方案。 但是我認為這太簡單了,我找不到這種更簡單的解決方案。 我對這個解決方案正確嗎? 還是這個解決方案有問題?

public boolean checkAnagram(String a, String b){
    if(a.length() != b.length()) return false;
    a=a.toLowerCase();
    b=b.toLowerCase();
    int length= a.length();
    int sum1=0;
    int sum2=0;
    for(int i=0;i<length;i++){
        sum1 += a.charAt(i);
        sum2 +=b.charAt(i);
    }

    if(sum1==sum2){
        return true;
    } else {
        return false;
    }
}

該解決方案是錯誤的-對值求和會丟失大量數據,尤其是值的分布方式。 例如,如果將“ AC”和“ BB”輸入此函數,則會得到true ,這是錯誤的結果。

相反,您應該計算每個字符出現在每個字符串中的次數並進行比較:

public static boolean checkAnagram(String a, String b){
    // optimiztion, will also work without it
    if (a.length() != b.length()) {
        return false;
    }
    Map<Character, Long> aMap = countChars(a);
    Map<Character, Long> bMap = countChars(b);
    return a.equals(b);
}

private static Map<Character, Long> countChars(String s) {
    return s.chars()
            .mapToObj(c -> Character.toLowerCase((char) c))
            .collect(Collectors.groupingBy(Function.identity(), 
                     Collectors.counting()));
}

這將不起作用,因為ac等於bb

您實際上需要跟蹤字符:

int[] aArr = new int[26];
int[] bArr = new int[26];
for(char c : a. toLowerCase().toCharArray()) {
    aArr[c - 'a']++;
}
// same for b
return Arrays.equals(aArr, bArr);

時間復雜度為O(n) (使用長度檢查)

將字符串轉換為char數組,並使用Arrays.sort()對其進行排序

String str1 = "anagram";
String str1 = "margana";
char arrChar1[]= str1.toLowerCase().toCharArray(); 
char arrChar2[]= str2.toLowerCase().toCharArray();
Arrays.sort(arrChar1);
Arrays.sort(arrChar2);
System.out.println(Arrays.equals(arrChar1,arrChar2));//check if is equals with char to char
//if true is anagram if false is not

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM