0

最適化が必要なコードがあります。

 for (int i = 0; i < wordLength; i++) {
   for (int c = 0; c < alphabetLength; c++) {
     if (alphabet[c] != x.word.charAt(i)) {
        String res = WordList.Contains(x.word.substring(0,i) +
                     alphabet[c] +
                     x.word.substring(i+1));
      if (res != null && WordList.MarkAsUsedIfUnused(res)) {
        WordRec wr = new WordRec(res, x);
        if (IsGoal(res)) return wr;
        q.Put(wr);
      }
    }
  }

単語は文字列で表されます。問題は、文字列が不変であるため、4 ~ 6 行目のコードが多くの文字列オブジェクトを作成することです。

より高速なコードを取得したい場合、単語表現をどのデータ構造に変更すればよいですか? char[] に変更しようとしましたが、次のコードを機能させるのに問題があります。

x.word.substring(0,i)

char[] から部分配列を取得するには? 4.6 行目の char と char[] を連結する方法は?

私が使用できる他の適切で変更可能なデータ構造はありますか? stringbuffer について考えましたが、stringbuffer に対する適切な操作が見つかりません。

この関数は、特定の単語を指定すると、1 文字異なるすべての単語を生成します。WordRec は、単語を表す文字列と、その単語の「親」へのポインタを持つ単なるクラスです。

前もって感謝します

4

1 に答える 1

0

このアプローチを使用すると、オブジェクトの数を減らすことができます。

StringBuilder tmp = new StringBuilder(wordLength);
tmp.append(x.word);
for (int i=...) {
    for (int c=...) {
        if (...) {
           char old = tmp.charAt(i);
           tmp.setCharAt(i, alphabet[c]);
           String res = tmp.toString();
           tmp.setCharAt(i, old);
           ...
        }
    }
}
于 2013-04-20T22:36:12.090 に答える