IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 127. 单词接龙(双向BFS) -> 正文阅读

[数据结构与算法]127. 单词接龙(双向BFS)

字典?wordList 中从单词 beginWord?和 endWord 的 转换序列 是一个按下述规格形成的序列?beginWord -> s1?-> s2?-> ... -> sk:

每一对相邻的单词只差一个字母。
?对于?1 <= i <= k?时,每个?si?都在?wordList?中。注意, beginWord?不需要在?wordList?中。
sk?== endWord
给你两个单词 beginWord?和 endWord 和一个字典 wordList ,返回 从?beginWord 到?endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

?
示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord "cog" 不在字典中,所以无法进行转换。
?

提示:

1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord、endWord 和 wordList[i] 由小写英文字母组成
beginWord != endWord
wordList 中的所有字符串 互不相同

单向版本,时间152ms

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordlist(wordList.begin(), wordList.end());
        if (wordlist.count(endWord) == 0)
            return 0;
        queue<string> q;
        q.push(beginWord);
        unordered_set<string> flag;
        int step = 1;
        while (!q.empty()) {
            int size = q.size();
            while (size--) {
                string word = q.front();
                q.pop();
                for (int i = 0; i < word.size(); i++) {
                    for (int j = 'a'; j <= 'z'; j++) {
                        string temp = word;
                        if (j != word[i]) {
                            temp[i] = j;
                            if (wordlist.count(temp) == 0)
                                continue;
                            if (temp == endWord) {
                                return step + 1;
                            }
                            if (flag.count(temp) == 0) {
                                flag.insert(temp);
                                q.push(temp);
                            }
                        }
                    }
                }
            }
            step++;
        }
        return 0;
    }
};

双向版本,时间28ms?

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordlist(wordList.begin(), wordList.end());
        if (wordlist.count(endWord) == 0)
            return 0;
        queue<string> front;
        queue<string> back;
        front.push(beginWord);
        back.push(endWord);
        unordered_map<string, int> front_flag;
        unordered_map<string, int> back_flag;
        front_flag.insert(make_pair(beginWord, 1));
        back_flag.insert(make_pair(endWord, 1));
        while (!front.empty() && !back.empty()) {
            int t = -1;
            if (front.size() <= back.size()) {
                t = update(front, front_flag, back_flag, wordlist);
            }
            else {
                t = update(back, back_flag, front_flag, wordlist);
            }
            if (t != -1)
                return t;
        }
        return 0;
    }

    int update(queue<string>& q, unordered_map<string, int>& flag, unordered_map<string, int>& other_flag, unordered_set<string>& wordlist) {
        int size = q.size();
        while (size--) {
            string word = q.front();
            q.pop();
            for (int i = 0; i < word.size(); i++) {
                for (int j = 'a'; j <= 'z'; j++) {
                    string temp = word;
                    if (j != word[i]) {
                        temp[i] = j;
                        if (wordlist.count(temp) == 0)
                            continue;
                        if (other_flag.count(temp) != 0) {
                            return flag[word] + other_flag[temp];
                        }
                        if (flag.count(temp) == 0) {
                            flag.insert(make_pair(temp, flag[word] + 1));
                            q.push(temp);
                        }
                    }
                }
            }
        }
        return -1;
    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:08:32  更:2022-05-10 12:11:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:46:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码