web-dev-qa-db-ja.com

2つの文字列に同じ文字が含まれているかどうかを確認していますか?

2つの文字列に同じ文字が含まれているかどうかを確認する方法はありますか?例えば、

abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
9
Brent

各文字列をchar []に変換し、その配列を並べ替えてから、2つを比較します。

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);
}
24
GaryF

これを行う非常に簡単な方法ですが、あまり効率的ではありません。Stringsをchar配列に変換し、それらでJava.util.Arrays.sortを使用して、Stringsを取得し、等しいかどうかを比較します。 。文字列が数千文字未満の場合、それは非常に問題ないはずです。

数メガバイトの文字列がある場合は、(コードをインデックスとして使用して)各文字のカウントを含む配列を作成し、1つの文字列に1つのパスを追加して、各文字のカウントに1つ追加し、2番目に1つのパスを作成することができます。 1つを削除する文字列。 2回目のパスのいずれかの時点で0に該当する場合、それらは同じ文字を持っていません。エラーなしで2番目の文字列を使い終わったら、同じ長さであれば同じ文字であることがわかります(とにかく最初にチェックする必要があります)。
この2番目の方法は、文字列の並べ替えよりもはるかに複雑で、Unicode文字列を操作する場合は大きな配列が必要ですが、ASCIIセットの128文字だけで問題がない場合は完全に優れています。 、そしてはるかに高速です。
文字列に数百万文字が含まれていない場合は、気にしないでください。文字列の並べ替えははるかに簡単で、数十文字しかない文字列ではそれほど遅くはありません。

7
Jean

(ニッチピッキング;-))サイドノートとして:

ここで提案するソリューションは、Unicodeの Basic Multilingual Plane (BMP)の文字で構成される文字列に対してのみ機能することに注意してください。

BMPの外側の文字は、char内のStringペアとして表されるため、特に注意する必要があります。したがって、ペアをまとめておく必要があります。詳細については、Java.lang.CharacterのJavadocを参照してください。

幸い、BMP以外のほとんどの文字はかなりエキゾチックです。日本語と中国語のほとんどでさえ、BMPに含まれています...

3
sleske

多分それは最速の答えではありませんが、それは最短の答えでなければなりません。

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;
}
3
guilin 桂林

特定の文字列の署名を作成することを検討してください。カウントと文字を使用します。

a-count:b-count:c-count:.....:z-count:(必要に応じて大文字に拡張します)。

次に、署名を比較します。これは、非常に大きな文字列に対してより適切にスケーリングする必要があります。

ショートカットとして、長さを確認してください。それらが一致しない場合でも、とにかくfalseを返します。

1
Jayan

文字列をchar配列に変換し、配列を並べ替えると、配列を比較できます。

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");
}
1
codaddict

ここに:

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();
}

}

0
Siba

ここに:

    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 */
    }
0
Erhan Bagdemir