题目链接:力扣
这道题是一道经典的BFS题型,我觉得可能会踩坑导致不能一次AC的地方有两处:一是bankSize可能为0,那么我们开辟一个记录数组的时候会报错;二是题目所说的“起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中”。所以我在广搜之前,先要对bankSize做防护,再就是先遍历一遍bank数组里的所有有效序列,对于和start相同的序列,要将记录数组对应着的下标置为true,表示我们已经搜索过这个序列,其他需要注意的地方就没有了,以下是具体的C语言代码实现。
#define LEN 8
static bool effective_change(char *str1, char *str2)
{
int diff_cnt = 0;
for (int i = 0; i < LEN; i++) {
if (str1[i] == str2[i]) {
continue;
}
diff_cnt++;
}
return (diff_cnt == 1);
}
int minMutation(char * startGene, char * endGene, char ** bank, int bankSize)
{
if (bankSize == 0) {
return -1;
}
int ans = 0;
char quene[10][LEN + 1];
int front = 0;
int rear = 0;
strcpy(quene[rear++], startGene);
bool mark[bankSize];
for (int i = 0; i < bankSize; i++) {
mark[i] = false;
if (strcmp(startGene, bank[i]) == 0) {
mark[i] = true;
}
}
while (front != rear) {
bool change_flag = false;
int cnt = rear - front;
for (int i = 0; i < cnt; i++) {
if (strcmp(quene[front], endGene) == 0) {
return ans;
}
for (int j = 0; j < bankSize; j++) {
if (!mark[j] && effective_change(quene[front], bank[j])) {
change_flag = true;
mark[j] = true;
strcpy(quene[rear++], bank[j]);
}
}
front++;
}
if (change_flag) {
ans++;
}
}
return -1;
}