Geek

博客园 首页 新随笔 联系 订阅 管理

题目描述
给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度:
每一次转换只能改变一个单词
每一个中间词都必须存在单词字典当中
例如:
给定的初始单词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;
    }
    
    
    
};


posted on 2021-01-25 14:53  .geek  阅读(210)  评论(0编辑  收藏  举报