题目描述
给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:
每一次转换只能改变一个单词
每一个中间词都必须存在单词字典当中
例如:
给定的初始单词start="red",
目标单词end ="tax"。
单词字典dict =["ted","tex","red","tax","tad","den","rex","pee"]
一个最短的转换序列为"red" -> "ted" -> "tad" -> "tax",
返回长度4
注意:
如果没有符合条件的转换序列,返回0。
题目中给出的所有单词的长度都是相同的
题目中给出的所有单词都仅包含小写字母
#define dist second
#define str first
typedef pair<string,int> State;
class Solution {
public:
int ladderLength(string start, string end, unordered_set<string> &dict) {
if(start==end) return 0;
queue<State> q;
q.push({start,0});
// unordered_map<string,int> _map;
while (q.size()) {
auto state = q.front();q.pop();
string s = state.str;int dist = state.dist;
if(s==end) {
return dist+1;//搜索到终点
}
if(!dict.count(s)) continue;
dict.erase(s);
for(int i=0;i<s.size();++i) {
for(int j='a';j<='z';++j) {
if(s[i]==j) continue;
char pre = s[i];s[i]=j;
if(dict.count(s)) {
q.push({s,dist+1});
//去重 减枝
// dict.erase(s);
}
//还原状态
s[i] = pre;
}
}
}
return 0;
}
};