3

文字列のリストがあり、各文字列について、その文字を他のすべての文字列と照合して、1つを除いてすべての文字が同一であるかどうかを確認したいと思います。

たとえば、trueを返すチェックはチェックです

ロックに対してロック

時計と群れには、それ以上でもそれ以下でもない、異なる1つの文字があります。

へこみに対するロックは明らかにfalseを返します。

私は最初にリストをループし、次にそのリスト内に2番目のループを作成して、最初の文字列を2番目の文字列と照合することを考えていました。

次に、を使用split("");して各文字列の文字を含む2つの配列を作成し、配列要素を相互にチェックします(つまり、各文字列を他の配列の同じ位置と比較します1-1 2-2など)。 1文字の比較のみが失敗した場合、これら2つの文字列のチェックは真になります。

とにかく私はたくさんの文字列(4029)を持っていて、現時点で実装しようと考えていることを考えると、互いに3つのループが含まれているため、その多くの要素で長い時間がかかるキュービックループ(?)になりますそうじゃない?

これを行う簡単な方法はありますか?それとも、この方法は実際に問題なく機能しますか?または-うまくいけば-ではありませんが、私が提案したソリューションに何らかの潜在的な論理的欠陥がありますか?

どうもありがとう!

4

5 に答える 5

5

なぜ素朴な方法でそれをしないのですか?

bool matchesAlmost(String str1, String str2) {
    if (str1.length != str2.length)
        return false;
    int same = 0;
    for (int i = 0; i < str1.length; ++i) {
        if (str1.charAt(i) == str2.charAt(i))
            same++;
    }
    return same == str1.length - 1;
}

これで、二次アルゴリズムを使用して、すべての文字列を他の文字列と照合することができます。

于 2012-10-14T15:31:04.040 に答える
0

2 つの文字列の長さが等しいと仮定すると、

String str1 = "rock";
        String str2 = "lick";

        if( str1.length() != str2.length() )
            System.out.println( "failed");

        else{
            if( str2.contains( str1.substring( 0, str1.length()-1)) || str2.contains(  str1.substring(1, str1.length() )) ){
                System.out.println( "Success ");
            }

            else{
                System.out.println( "Failed");
            }
        }
于 2012-10-14T15:35:29.000 に答える
0

すべての文字列の長さが同じであると仮定すると、これが役立つと思います。

public boolean differByOne(String source, String destination)
{
    int difference = 0;

    for(int i=0;i<source.length();i++)
    {
        if(source.charAt(i)!=destination.charAt(i))
        {
            difference++;

            if(difference>1)
            {
                return false;
            }
        }
    }

    return difference == 1;
}
于 2016-07-18T21:04:41.263 に答える
0

これが最善のアプローチかどうかはわかりませんが、これは 2 つの文字列の長さが同じでない場合でも機能します。例 : cat & cattp これらは 1 文字 p だけ異なり、t が繰り返されます。ハッシュマップと文字配列に追加のスペースを使用する O(n) 時間のソリューションのように見えます。

/**
 * Returns true if two strings differ by one character
 * @param s1 input string1
 * @param s2 input string2
 * @return true if strings differ by one character 
 */
boolean checkIfTwoStringDifferByOne(String s1, String s2) {
    char[] c1, c2;

    if(s1.length() < s2.length()){
        c1 = s1.toCharArray();
        c2 = s2.toCharArray();
    }else{
        c1 = s2.toCharArray();
        c2 = s1.toCharArray();
    }

    HashSet<Character> hs = new HashSet<Character>();

    for (int i = 0; i < c1.length; i++) {
        hs.add(c1[i]);
    }
    int count = 0;
    for (int j = 0; j < c2.length; j++) {
        if (! hs.contains(c2[j])) {
            count = count +1;
        }
    }

    if(count == 1)
        return true;
    return false;
}
于 2013-10-23T01:53:47.997 に答える