13

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

abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
4

12 に答える 12

27

各文字列を 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);
}
于 2010-10-21T07:54:09.587 に答える
8

非常に簡単ですが、あまり効率的ではありませんが、Strings を char 配列に変換し、それらに対して java.util.Arrays.sort を使用し、Strings を取得して等価性を比較します。文字列が数千文字未満であれば、問題ありません。

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

于 2010-10-21T08:01:46.073 に答える
3

最速の答えではないかもしれませんが、最短の答えでなければなりません。

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;
}
于 2010-10-21T08:58:10.463 に答える
3

(つまらない ;-) ) サイドノートとして:

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

BMP の外の文字は の のペアとして表さcharれるStringため、特別な注意を払う必要があるため、ペアをまとめて保管してください。詳細については、の Javadoc を参照してjava.lang.Characterください。

幸いなことに、BMP 以外のほとんどのキャラクターはかなり風変わりです。日本語と中国語のほとんどでさえ、BMP に入っています...

于 2010-10-21T08:03:37.490 に答える
2

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

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

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

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

于 2010-10-21T08:49:53.383 に答える
1

文字列を 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");
}
于 2010-10-21T07:54:45.013 に答える
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();
}

}

于 2013-08-13T20:45:23.080 に答える
0
public static boolean isSameLetters(String word1, String word2){
    String s1 = Arrays.stream(word1.trim().strip().replaceAll("\\s","").split("")).sorted().collect(Collectors.joining());
    String s2 = Arrays.stream(word2.trim().strip().replaceAll("\\s","").split("")).sorted().collect(Collectors.joining());
    System.out.printf("word 1: %s\nword 2: %s\n",s1,s2);
    return s1.equals(s2);
}
于 2022-01-09T15:24:14.677 に答える
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 */
    }
于 2010-10-21T07:59:06.953 に答える