struct Trie {
int ch[27];
int val;
} trie[50001];
int size, nodeNum;
int insert(char* s, int num) {
int sSize = strlen(s), add = 0;
for (int i = 0; i < sSize; ++i) {
int x = s[i] - '`';
if (trie[add].ch[x] == 0) {
trie[add].ch[x] = ++size;
//初始化下一个trie数据
memset(trie[size].ch, 0, sizeof(trie[size].ch));
trie[size].val = -1;
}
add = trie[add].ch[x];
}
trie[add].val = num;
return num;
}
int find(char* s) {
int sSize = strlen(s), add = 0;
for (int i = 0; i < sSize; ++i) {
int x = s[i] - '`';
if (trie[add].ch[x] == 0) {
return -1;
}
add = trie[add].ch[x];
}
return trie[add].val;
}
int addWord(char* word) {
int ret = find(word);
return (ret==-1)? insert(word, nodeNum++): ret;
}
int edge[30001][26];
int edgeSize[30001];
void addEdge(char* word) {
int wordSize = strlen(word);
int id1 = addWord(word);
for (int i = 0; i < wordSize; ++i) {
char tmp = word[i];
word[i] = '`';
int id2 = addWord(word);
edge[id1][edgeSize[id1]++] = id2;
edge[id2][edgeSize[id2]++] = id1;
word[i] = tmp;
}
}
int ladderLength(char* beginWord, char* endWord, char** wordList, int wordListSize) {
size = nodeNum = 0;
memset(trie[size].ch, 0, sizeof(trie[size].ch));
trie[size].val = -1;
memset(edgeSize, 0, sizeof(edgeSize));
for (int i = 0; i < wordListSize; ++i) {
addEdge(wordList[i]);
}
addEdge(beginWord);
int beginId = find(beginWord);
int endId = find(endWord);
if (endId == -1) {
return 0;
}
int* dis=(int*)malloc(nodeNum*sizeof(int));
memset(dis, -1, sizeof(int)*nodeNum);
dis[beginId] = 0;
int* que=(int*)malloc(nodeNum*sizeof(int));
int left = 0, right = 0;
que[right++] = beginId;
while (left < right) {
int x = que[left++];
for (int i = 0; i < edgeSize[x]; ++i) {
if (dis[edge[x][i]] == -1) {
dis[edge[x][i]] = dis[x] + 1;
if (edge[x][i] == endId) {
return dis[edge[x][i]] / 2 + 1;
}
que[right++] = edge[x][i];
}
}
}
return 0;
}