2010-10-21 299 views
6

有沒有辦法檢查兩個字符串是否包含相同的字符。例如,檢查2個字符串是否包含相同的字符?

abc, bca -> true 
aaa, aaa -> true 
aab, bba -> false 
abc, def -> false 
+0

的可能重複的[檢查兩個字符串是否彼此的排列](HTTP:// stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other) – finnw 2010-10-21 09:07:16

回答

20

將每個字符串轉換爲char [],對該數組進行排序,然後比較兩者。簡單。

private boolean sameChars(String firstStr, String secondStr) { 
    char[] first = firstStr.toCharArray(); 
    char[] second = secondStr.toCharArray(); 
    Arrays.sort(first); 
    Arrays.sort(second); 
    return Arrays.equals(first, second); 
} 
+0

...並刪除重複es比較 – testalino 2010-10-21 07:55:10

+6

不,如果我們刪除重複項,那麼「aab,bba」將返回true,並將其指定爲返回false。 – GaryF 2010-10-21 07:56:49

+0

是的,你是對的 – testalino 2010-10-21 08:00:05

1

您可以將字符串轉換成字符數組,數組排序和比較他們的陣列:

String str1 = "abc";     
String str2 = "acb"; 
char[] chars1 = str1.toCharArray(); 
char[] chars2 = str2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

if(Arrays.equals(chars1,chars2)) { 
     System.out.println(str1 + " and " + str2 + " are anagrams"); 
} else { 
     System.out.println(str1 + " and " + str2 + " are not anagrams"); 
} 
0

這裏:

String str1 = "abc"; 
    String str2 = "cba"; 
    /* create sorted strings */ 

/* old buggy code 
    String sorted_str1 = new String(java.utils.Arrays.sort(str1.toCharArray())); 
    String sorted_str2 = new String(java.utils.Arrays.sort(str2.toCharArray())); 
*/  
/* the new one */ 
char [] arr1 = str1.toCharArray(); 
char [] arr2 = str2.toCharArray(); 
java.utils.Arrays.sort(arr1); 
java.utils.Arrays.sort(arr2); 
String sorted_str1 = new String(arr1); 
String sorted_str2 = new String(arr2); 

if (sorted_str1.equals(sorted_str2)) { 
     /* true */ 
    } else { 
     /* false */ 
    } 
+1

Arrays.sort(..)具有返回類型的void,所以不能直接在String構造函數中使用它。 – GaryF 2010-10-21 08:01:23

+0

你是對的。我已更正了代碼並再次發佈。 – 2010-10-21 08:08:10

6

一個非常簡單的 - 但不是很有效 - 這樣做的方法是,將你的String s轉換爲char數組,然後在它們上使用java.util.Arrays.sort,並返回String並比較相等性。 如果你的字符串在幾千個字符以下,那應該是非常好的。

如果您有幾個字節的字符串,您可能需要創建一個數組,每個字符的計數(使用其代碼作爲索引),對每個字符的計數添加一個字符串,傳遞第二個字符串刪除一個。如果你在第二次過程中的任何時候都落在0以下,那麼它們的字符不會相同。當你完成第二個字符串而沒有錯誤時,如果它們具有相同的長度(你應該首先檢查它),那麼確定它們具有相同的字符。
第二種方法比排序字符串要複雜得多,如果你想使用unicode字符串,它需要一個大數組,但是如果你只有128個字符的ASCII字符集,並且很好更快。
如果您的字符串中沒有數百萬字符,請不要打擾。對字符串進行排序要容易得多,對於只有幾十個字符的字符串來說,排序速度並不會太慢。

+0

+1指出不同解決方案的優缺點 – sleske 2010-10-21 08:42:47

3

爲A(挑剔;-))邊注:

請注意,這裏提出的解決方案僅適用於從Basic Multilingual Plane的Unicode(BMP)字符的字符串組成的工作。

的BMP之外的字符被表示爲在Stringchar,所以你需要格外注意,所以你保持對在一起。血腥的細節請參閱java.lang.Character的Javadocs。

幸運的是,BMP以外的大多數字符都比較奇特。即使大部分日語和漢語都在BMP中...

+0

實際上,這裏的解決方案在BMP之外工作就好了。問題在於它們不適用於非標準化的字符串;問題是「é」可以寫成單個字符,也可以寫成「e」和重音。 (這對於一些歐洲語言來說是個問題,也很少有人會遇到這個問題。) – 2010-10-21 08:17:33

+0

@Donal Fellows:他們如何在BMP之外工作?來自BMP外部的字符將被表示爲一對代理,即兩個「字符」。如果你然後調用例如'Arrays.sort(chars1)',不知道替代品的排序功能,會高興地撕開替代品併產生垃圾數據。或者我錯過了什麼? – sleske 2010-10-21 08:37:23

+0

@Donal Fellows:但當然你說得對,問題也會出現在字符組合中。順便說一句,使用規範化的字符串是不夠的,因爲有幾種不同的規範化,有些使用組合字符。 – sleske 2010-10-21 08:41:28

1

考慮爲給定字符串創建簽名。使用數字和字符。

a-count:b-count:c-count:.....:z-count:(如果需要,可以擴展爲大寫)。

然後比較簽名。對於非常大的字符串,這應該更好地擴展。

作爲快捷方式,請檢查長度。如果它們不匹配,則返回false。

2

也許這不是最快的答案,但必須最短的答案。

boolean hasSameChar(String str1, String str2){ 
    for(char c : str1.toCharArray()){ 
    if(str2.indexOf(c) < 0) return false; 
    } 
    for(char c : str2.toCharArray()){ 
    if(str1.indexOf(c) < 0) return false; 
    } 
    return true; 
} 
0

這裏:

import java.util.Arrays; 

公共類CompareString {

String str = "Result"; 
String str1 = "Struel"; 

public void compare() { 
    char[] firstString = str.toLowerCase().toCharArray(); 
    char[] secondString = str1.toLowerCase().toCharArray(); 

    Arrays.sort(firstString); 
    Arrays.sort(secondString); 

    if (Arrays.equals(firstString, secondString) == true) { 
     System.out.println("Both the string contain same charecter"); 
    } else { 
     System.out.println("Both the string contains different charecter"); 
    } 
} 

public static void main(String[] args) { 
    CompareString compareString = new CompareString(); 
    compareString.compare(); 
} 

}

相關問題