题目链接: 字母串接龙
本体需要判断两个字符之间是不是差一个字符,如果差一个字符,那就是存在连接。那么不同的字符串之间,就能够构成一幅无向图,需要求的问题就转化为 起点和终点的最短路径长度。无向图的最短路径,选择广度优先而非深度优先,因为广度优先搜索,那么首先得到的路径就是最短的路径,而深度搜索则还需要去对比搜索得到的路径的长度。
#include <iostream>
#include <unordered_set>
#include <queue>
#include <string>
#include <vector>
using namespace std;
int minTransformations(int N, const string& beginStr, const string& endStr, const vector<string>& strList) {
unordered_set<string> strSet(strList.begin(), strList.end());
queue<pair<string, int>> q;
unordered_set<string> visited;
q.push({beginStr, 1});
visited.insert(beginStr);
while (!q.empty()) {
auto [currentStr, steps] = q.front();
q.pop();
// 对当前字符串的每个字符进行尝试替换a
for (int i = 0; i < currentStr.size(); ++i) {
string temp = currentStr;
for (char c = 'a'; c <= 'z'; ++c) {
if (temp[i] != c) { // 进行字符替换
temp[i] = c;
// 如果temp等于endStr,返回当前步数加一
if (temp == endStr) {
return steps + 1;
}
// 如果新字符串在字典中且未访问过,将其加入队列和访问集合
if (strSet.find(temp) != strSet.end() && visited.find(temp) == visited.end()) {
visited.insert(temp);
q.push({temp, steps + 1});
}
}
}
}
}
return 0; // 如果耗尽队列仍未找到endStr
}
int main() {
int N;
cin >> N;
string beginStr, endStr;
cin >> beginStr >> endStr;
vector<string> strList(N);
for (int i = 0; i < N; ++i) {
cin >> strList[i];
}
cout << minTransformations(N, beginStr, endStr, strList) << endl;
return 0;
}