0

String[]1文字だけ異なる単語の有効な組み合わせを含むを返すメソッドを作成しています。このメソッドはString、最初のパラメーターとして単語の辞書を含む配列を受け取り、2 番目と 3 番目のパラメーターとしてそれぞれ単語 1 と 2 を含む他の 2 つの文字列を受け取ります。

これが私の方法です:

public static String[] findCombos(String[] dict, String a, String b){
    char[] wordA = a.toCharArray();
    char[] wordB = b.toCharArray();
    int length = wordA.length;
    List<String> validCombos = new ArrayList<String>();
    Arrays.sort(dict);
    //wordA     
    for(int i = 0; i<length; i++){
        char tmp = wordA[i];
        wordA[i] = 0;
        String tmpWordA = new String(wordA).trim();
        //tmpWordA = tmpWordA + wordA.toString().trim();
        if(Arrays.binarySearch(dict, tmpWordA) >= 0){
            int lengthb = wordB.length;
            String tmpWordB = new String(wordB).trim();
            //tmpWordB = tmpWordB + wordB.toString();
            for(int j = 0; j<lengthb; j++){
                tmpWordB = new StringBuffer(tmpWordB).insert(j ,tmp).toString();
                if(Arrays.binarySearch(dict, tmpWordB) >= 0){
                    validCombos.add(tmpWordA + "\\t" + tmpWordB);//combo found
                }else{
                    wordA[i] = tmp;
                }
            }
        }else{
            wordA[i] = tmp;
        }
    }
    //wordB
    int lengthb = b.length();
    for(int i = 0; i<lengthb; i++){
        char tmp = wordB[i];
        wordB[i] = 0;
        String tmpWordB = new String(wordB).trim();
        //tmpWordB = tmpWordB + wordB.toString().trim();
        if(Arrays.binarySearch(dict, tmpWordB) >= 0){
            int lengtha = a.length();
            String tmpWordA = new String(wordA).trim();
            //tmpWordA = tmpWordA + wordA.toString();
            for(int j = 0; j< lengtha; j++){
                tmpWordA = new StringBuffer(tmpWordA).insert(j, tmp).toString();
                if(Arrays.binarySearch(dict, tmpWordA) >= 0){
                    validCombos.add(tmpWordA + "\\t" + tmpWordB);//combo found
                }else{
                    wordB[i] = tmp;
                }
            }
        }else{
            wordB[i] = tmp;
        }
    }
    String[] res = validCombos.toArray(new String[0]);
    return res;
}

配列はソートされており、問題の要素が配列内にあることは確かですが、検索は負の数を返し続け、else句に自動的に分岐します。何か案は?辞書へのリンクは次のとおりです。

辞書 - PasteBin

4

1 に答える 1

1

インデックス i の文字を削除しているのではなく、インデックスの文字iを 0 に置き換えているため、誤った仮定によってアルゴリズムが壊れます。

StringBuilder を使用して文字配列からインデックスで文字を削除する

String mystring = "inflation != stealing";
char[] my_char_array = mystring.toCharArray();
StringBuilder sb = new StringBuilder();
sb.append(mystring);
sb.deleteCharAt(10);
my_char_array = sb.toString().toCharArray();
System.out.println(my_char_array);             //prints "inflation = stealing"

上記のコードは、文字配列から感嘆符を削除します。

独自の Java 関数をロールして、文字配列から文字を削除します。

String msg = "johnny can't program, he can only be told what to type";

char[] mychararray = msg.toCharArray();
mychararray = remove_one_character_from_a_character_array_in_java(mychararray, 21);
System.out.println(mychararray);

public char[] remove_one_character_from_a_character_array_in_java(
                           char[] original, 
                           int location_to_remove)
{
    char[] result = new char[original.length-1];
    int last_insert = 0;
    for (int i = 0; i < original.length; i++){
        if (i == location_to_remove)
            i++;

        result[last_insert++] = original[i];
    }
    return result;
}

//The above method prints the message with the index removed.

ソース: https://stackoverflow.com/a/11425139/445131

于 2013-01-08T15:15:57.707 に答える