DBFS[leetcode 127]

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        return DBFS(beginWord, endWord, wordList);
       // return ladderLength1(beginWord, endWord, wordList);
    }

private:
    int BFS(string beginWord, string endWord, vector<string>& wordList)
    {
        //step1 preprocess the wordlist;
        //对wordList打个表;
        unordered_multimap<string, string> dict;
        //visited实际上是记录访问的;
        unordered_set<string> visited;

        bool isValid = false;
        for (auto& word : wordList) {
            if (word == endWord) isValid = true;
            string str = word;
            for (int i = 0; i < word.size(); i++) {
                //string str = word;
                str[i] = '*';
                dict.emplace(str, word);
                str[i] = word[i];
            }
        }

        //如果转换表中没有到结果的转换,那么肯定就不行了;
        if (!isValid) return 0;

        //接下来就是BFS套路;
        queue<string> qu;
        qu.push(beginWord);
        int step = 1;
        while(!qu.empty()) {
            step++;
            int len = qu.size();
            while (len--) {
                string cur = qu.front();
                qu.pop();
                for (int i = 0; i < cur.size(); i++) {
                    char tmp = cur[i];
                    cur[i] = '*';
                    //在dict表中查找;
                    auto range = dict.equal_range(cur);
                    for (auto itr = range.first; itr != range.second; itr++) {
                        if (visited.count(itr->second) == 0) { //当关键字没有被访问时;
                            if (itr->second == endWord) return step;
                            qu.push(itr->second);
                            visited.emplace(itr->second);
                        }
                    }
                    cur[i] = tmp;
                }
            }
        }

        return 0;
    }


int visitWordNode(unordered_multimap<string, string>& dict,  queue<pair<string, int>>& qu, unordered_map<string, int>& start_visited,
            unordered_map<string, int>& end_visited)
{
        
            auto p1 = qu.front();
            auto s1 = p1.first;
            qu.pop();
            for (int i = 0; i < s1.size(); i++) {
                char tmp = s1[i];
                s1[i] = '*';

                auto range = dict.equal_range(s1);
                for (auto it = range.first; it != range.second; it++) {
                    if (end_visited.find(it->second) != end_visited.end())
                        return p1.second + end_visited[it->second];
                    if (start_visited.find(it->second) == start_visited.end()) {
                        start_visited.emplace(it->second, p1.second +1 );
                        qu.push(make_pair(it->second, p1.second +1));
                    }
                }
                s1[i] = tmp;
            }
            return -1;
}

int DBFS(string beginWord, string endWord, vector<string>& wordList)
{
          //对wordList打个表;
    unordered_multimap<string, string> dict;
        //visited实际上是记录访问的;
    unordered_map<string, int> start_visited;
    unordered_map<string, int> end_visited;

        bool isValid = false;
        for (auto& word : wordList) {
            if (word == endWord) isValid = true;
            string str = word;
            for (int i = 0; i < word.size(); i++) {
                //string str = word;
                str[i] = '*';
                dict.emplace(str, word);
                str[i] = word[i];
            }
        }

        //如果转换表中没有到结果的转换,那么肯定就不行了;
        if (!isValid) return 0;

        queue<pair<string, int>> s_qu;
        queue<pair<string, int>> e_qu;
        s_qu.push(make_pair(beginWord, 1));
        e_qu.push(make_pair(endWord, 1));

        end_visited.emplace(endWord, 1);
        start_visited.emplace(beginWord, 1);


        int step = 1;
        while (!s_qu.empty() && !e_qu.empty()) {
           int ans = visitWordNode(dict, s_qu, start_visited, end_visited);
           if (ans > -1) {
               return ans;
           }

           ans = visitWordNode(dict, e_qu, end_visited, start_visited);
           if (ans > -1) {
               return ans;
           }
        }

        return 0;
}

};

总的来说DBFS相对麻烦一点,多练练就好了

posted @   zhanghanLeo  阅读(123)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示