【
最短endWord beginWordから変換シーケンスの長さを見つけるために、二つの単語(beginWordとendWord)と辞書を、与えられました。変換は、次の規則に従う必要があります。
各変換は、唯一の文字を変更することができます。
単語の変換プロセスの途中には、辞書にある単語でなければなりません。
説明:
このような変換シーケンスが存在しない場合、それは0を返します。
すべての単語は、同じ長さを有しています。
すべての単語は小文字のみで構成されています。
辞書に存在しない単語を繰り返します。
あなたはbeginWord endWordと非空を想定することができ、2つは同じではありません。
例1:
输入:
beginWord = "ヒット"、
endWord = "コグ"、
wordListに= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログ"、 "コグ"]
出力:5
説明: - >「ホット」最短変換シーケンスは、「ヒット」で 、>「COG」 - - >「ドット」 - >「犬」
その長さ5を返します。
例2:
输入:
beginWord = "ヒット"
endWord = "コグ"
wordListに= [ "ホット"、 "ドット"、 "犬"、 "たくさん"、 "ログ"]
出力:0
説明:endWord「コグ」辞書で、それは変換できませんではありません。
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/word-ladder:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
】
この質問は、C言語で行うことは本当に難しいです。
私は前に深い検索を使用しているが、この質問は、幅広い検索に使用する必要があります。広い構築キューを検索する必要があるが、C言語のライブラリ関数自体は、キューとは関係ありません。一部の人々は、チェーンシミュレーションキューを使用しますが、タイムコードを無駄にして、ああ、我々はまだビルド車輪に持って質問を行い、そして私の心は不経済、荒廃しました。したがって、配列キューをシミュレートするために、グループスタックシミュレーションの数を考慮。
そして、キュー配列、尾、頭を準備します。次いで、十分に構造体の配列を取得するように構成された普通の配列を、発見しました。ワードリスト・IDXの預金、店舗の変換がカウントされます。
現在の単語間の差であれば、それはキャラクターに参加するために並んで、その後、beginWordワードと1つの比較、必然的な変換回数の最小数の要件を満たすために最初ずつ取り出さ見つけます。
この質問は価値がそれを何度も読んでいます。
int check(char *onew, char *twow, int len)
{
int i;
int diff = 0;
for (i = 0; i < len; i++) {
if(onew[i] != twow[i]) {
if (diff == 0) {
diff = 1;
} else {
return false;
}
}
}
return diff;
}
struct QUE {
int idx;
int count;
};
struct QUE que[8096];
int tail;
int head;
int ladderLength(char * beginWord, char * endWord, char ** wordList, int wordListSize){
int i;
int len = strlen(wordList[0]);
int endidx = 0xfffff;
int flag[wordListSize];
int count = 1;
int idx;
memset(flag, 0, sizeof(int) * wordListSize);
memset(que, 0, sizeof(int) * 8096);
tail = 0;
head = 0;
for (i = 0; i < wordListSize; i++) {
if (!strcmp(endWord, wordList[i])) {
endidx = i;
flag[i] = 1;
}
}
if (endidx == 0xfffff) {
return false;
}
que[tail].idx = endidx;
que[tail++].count = 1;
while (tail > head) {
idx = que[head].idx;
count = que[head++].count;
if (check(beginWord, wordList[idx], len)) {
return count + 1;
}
for(i = 0; i < wordListSize; i++) {
if(!flag[i] && check(wordList[idx], wordList[i], len)){
que[tail].idx = i;
que[tail++].count = count + 1;
flag[i] = 1;
}
}
}
return 0;
}