有沒有辦法檢查兩個字符串是否包含相同的字符。例如,檢查2個字符串是否包含相同的字符?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
有沒有辦法檢查兩個字符串是否包含相同的字符。例如,檢查2個字符串是否包含相同的字符?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
將每個字符串轉換爲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);
}
您可以將字符串轉換成字符數組,數組排序和比較他們的陣列:
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");
}
這裏:
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 */
}
Arrays.sort(..)具有返回類型的void,所以不能直接在String構造函數中使用它。 – GaryF 2010-10-21 08:01:23
你是對的。我已更正了代碼並再次發佈。 – 2010-10-21 08:08:10
一個非常簡單的 - 但不是很有效 - 這樣做的方法是,將你的String
s轉換爲char數組,然後在它們上使用java.util.Arrays.sort,並返回String
並比較相等性。 如果你的字符串在幾千個字符以下,那應該是非常好的。
如果您有幾個字節的字符串,您可能需要創建一個數組,每個字符的計數(使用其代碼作爲索引),對每個字符的計數添加一個字符串,傳遞第二個字符串刪除一個。如果你在第二次過程中的任何時候都落在0以下,那麼它們的字符不會相同。當你完成第二個字符串而沒有錯誤時,如果它們具有相同的長度(你應該首先檢查它),那麼確定它們具有相同的字符。
第二種方法比排序字符串要複雜得多,如果你想使用unicode字符串,它需要一個大數組,但是如果你只有128個字符的ASCII字符集,並且很好更快。
如果您的字符串中沒有數百萬字符,請不要打擾。對字符串進行排序要容易得多,對於只有幾十個字符的字符串來說,排序速度並不會太慢。
+1指出不同解決方案的優缺點 – sleske 2010-10-21 08:42:47
爲A(挑剔;-))邊注:
請注意,這裏提出的解決方案僅適用於從Basic Multilingual Plane的Unicode(BMP)字符的字符串組成的工作。
的BMP之外的字符被表示爲在String
的char
一對,所以你需要格外注意,所以你保持對在一起。血腥的細節請參閱java.lang.Character
的Javadocs。
幸運的是,BMP以外的大多數字符都比較奇特。即使大部分日語和漢語都在BMP中...
實際上,這裏的解決方案在BMP之外工作就好了。問題在於它們不適用於非標準化的字符串;問題是「é」可以寫成單個字符,也可以寫成「e」和重音。 (這對於一些歐洲語言來說是個問題,也很少有人會遇到這個問題。) – 2010-10-21 08:17:33
@Donal Fellows:他們如何在BMP之外工作?來自BMP外部的字符將被表示爲一對代理,即兩個「字符」。如果你然後調用例如'Arrays.sort(chars1)',不知道替代品的排序功能,會高興地撕開替代品併產生垃圾數據。或者我錯過了什麼? – sleske 2010-10-21 08:37:23
@Donal Fellows:但當然你說得對,問題也會出現在字符組合中。順便說一句,使用規範化的字符串是不夠的,因爲有幾種不同的規範化,有些使用組合字符。 – sleske 2010-10-21 08:41:28
考慮爲給定字符串創建簽名。使用數字和字符。
a-count:b-count:c-count:.....:z-count:
(如果需要,可以擴展爲大寫)。
然後比較簽名。對於非常大的字符串,這應該更好地擴展。
作爲快捷方式,請檢查長度。如果它們不匹配,則返回false。
也許這不是最快的答案,但必須最短的答案。
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;
}
這裏:
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();
}
}
的可能重複的[檢查兩個字符串是否彼此的排列](HTTP:// stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other) – finnw 2010-10-21 09:07:16