思路:
1、此题与127题相似,采用BFS(广度优先搜索算法)+ 队列方式进行遍历,同时将相关的遍历的步数step返回给函数。
2、详细分析,通过建立一个queue队列,每次检索出现的符合OneDiff不同的字符串,会从队尾进入队列。同时队列的前面会不断的判断是否满足跟end相同的字符串,如果相同就结束,返回相应的step值。如果不同的话,会沿着队列继续往下搜索。
3、通过一个状态数组visit[],记录每个元素的状态值,该元素已经访问过,则给这个元素标记一个状态,避免重复访问。
4、队列的结束条件并不是把整个数组遍历完成,而是把整个队列遍历完成,所以判断条件是队头和队尾是不是相同。
#define MAX_CNT 10000
int IsOneDiff(char *str1, char *str2 ){
int count = 0;
int len = strlen(str1);
for(int i = 0; i < len; i++){
if(str1[i] != str2[i]){
count++;
}
}
if(count == 1) {
return 1;
}
return 0;
}
int minMutation(char * start, char * end, char ** bank, int bankSize){
if(start == NULL || end == NULL || bank == NULL){
return -1;
}
if(bankSize == 0){
return -1;
}
int i;
for(i = 0; i < bankSize; i++){
if(strcmp (bank[i], end) == 0){
break;
}
}
if (i == bankSize){
return -1;
}
if(IsOneDiff(start, end)){
return 1;
}
int queue[MAX_CNT] = {0};
int visit[MAX_CNT] = {0};
int step[MAX_CNT] = {0};
int head = 0;
int tail = 0;
for(int i = 0; i < bankSize; i++){
if(IsOneDiff(start, bank[i])){
step[i] = 1;
visit[i] = 1;
queue[tail++] = i;
}
}
while(head != tail){
for(int i = 0; i < bankSize; i++){
if(visit[i] == 1 || IsOneDiff(bank[queue[head]],bank[i]) == 0){
continue;
}
if(strcmp(end, bank[i]) == 0){
return step[queue[head]]+1;
}
queue[tail++] = i;
visit[i] = 1;
step[i] = step[queue[head]] + 1;
}
head++;
}
return -1;
}