【程序员面试金典】面试题 17.22 . 单词转换

这篇具有很好参考价值的文章主要介绍了【程序员面试金典】面试题 17.22 . 单词转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

描述:给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。

编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。

示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出:
["hit","hot","dot","lot","log","cog"]

示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: []

解释: endWord "cog" 不在字典中,所以不存在符合要求的转换序列。

解题思路

思路:最直观的想法是,dfs+回溯。首先依次判断初始字符串是否和单词列表中的各个单词只相差一个字符,如果只相差一个字符则可以进行dfs遍历,如果某一次dfs即成功则直接返回;dfs的过程中依次判断当前字符串是否和单词列表中的尚未访问的各个单词只相差一个字符,如果只相差一个字符则进行dfs,如果某一次dfs成功则直接返回,反之进行回溯。

class Solution {
public:
    vector<string> res;
    bool flag=false;
    //比较s1和s2是否只相差一个字符
    bool compare(string s1,string s2)
    {
        if(s1.size()!=s2.size())
            return false;
        int cnt=0;
        for(int i=0;i<s1.size();i++)
            if(s1[i]!=s2[i])
                cnt++;
        return cnt==1;
    }
    void dfs(string curword,string endWord,vector<string>& wordList,vector<bool> &visited,int n,int index)
    {
        res.push_back(curword);
        visited[index]=true;
        if(curword==endWord)
        {
            flag=true;
            return;
        }
        //依次判断当前字符串是否和单词列表中的尚未访问的各个单词只相差一个字符
        for(int i=0;i<n;i++)
        {
            if(!visited[i]&&compare(curword,wordList[i]))
            {
            	//如果只相差一个字符则进行dfs
                dfs(wordList[i],endWord,wordList,visited,n,i);
                //如果某一次dfs成功则直接返回
                if(flag)
                    return;
                //反之进行回溯
                visited[index]=false;
                res.pop_back();
            }
        }
    }
    vector<string> findLadders(string beginWord, string endWord, vector<string>& wordList) 
    {
        int n=wordList.size();
        //标记数组 用于标记当前字符串是否被访问过
        vector<bool> visited(n,false);
        res.push_back(beginWord);
        //依次判断初始字符串是否和单词列表中的各个单词只相差一个字符
        for(int i=0;i<n;i++)
        {
        	//如果只相差一个字符则可以进行dfs遍历
            if(compare(beginWord,wordList[i]))
            {
                dfs(wordList[i],endWord,wordList,visited,n,i);
                //如果某一次dfs即成功则直接返回
                if(flag)
                    return res;
            }
        }
        //均没有成功则返回空数组
        return vector<string>();
    }
};

总结:注意思考的过程,先按照思路完成,再考虑超时优化。文章来源地址https://www.toymoban.com/news/detail-514093.html

到了这里,关于【程序员面试金典】面试题 17.22 . 单词转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【程序员面试金典】面试题 17.23. 最大黑方阵

    描述:给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小

    2024年02月12日
    浏览(27)
  • 【程序员面试金典】面试题 17.19. 消失的两个数字

    描述:给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 示例 2: 提示: nums.length = 30000 思路:最直观的想法是,位运算。消失的两个数字和只出现一次的两个元素,本质

    2024年02月12日
    浏览(33)
  • 【程序员面试金典】面试题 17.14. 最小K个数

    描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr)) 思路:最直观的想法是,排序。 扩展:最大堆。最小的k个数,那么就可以维持一个大小为k的最大堆,先填充k个数到最大堆中,然后再依次遍

    2024年02月11日
    浏览(42)
  • 【程序员面试金典】面试题 17.21. 直方图的水量

    描述:给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。 示例: 思路:最直观的想

    2024年02月11日
    浏览(31)
  • 《程序员面试金典(第6版)面试题 16.10. 生存人数(前缀和思想)

    给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的

    2024年02月02日
    浏览(35)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 1

    2023年04月08日
    浏览(38)
  • 程序员必会的英语单词汇总,学习速度可提高10倍,偷偷超越你身边的大聪明

    虽然说英语不好也能学编程,但学习速度却大大减慢,尤其是到后面你要查资料或者上Github等英文网站的时候,浏览器自带的翻译还会出错。 所以我专门花了几天的时间,结合自己这些年来的开发经验,把编程常用的英语单词都做了一次全面的汇总,总共700个计算机常用的单

    2023年04月20日
    浏览(26)
  • 读程序员的README笔记17_构建可演进的架构(下)

    1.3.3.1. 开发人员可以只专注于和自己相关的字段,因为它们会继承其他字段的默认值 1.3.3.2. 默认值可使大型API在感觉上很小巧 1.4.1.1. OpenAPI通常用于RESTful服务 1.4.1.2. non-REST服务则使用Protocol Buffers、Thrift或类似的接口定义语言(interface definition language,IDL) 1.4.1.3. 接口定义工

    2024年02月04日
    浏览(42)
  • 程序员面试逻辑题

    答案: 这个题有点像数学归纳法,就是假设有 A A A 和 B B B 两个人是黑色的帽子,这样的话第一次开灯, A A A 看到 B B B 是黑色的,其他人都是白色的,那么 A A A 会觉得 B B B 是那个黑色的,同理 B B B 也是这么想的。一次关灯之后 A A A 和 B B B 都没有打耳光, A A A 反应过来

    2024年02月09日
    浏览(65)
  • 程序员面试完之后,人麻了...

    去面试吧   面不被录用的试 面hr为了完成任务的试 面一轮二轮没有下文试 面需要通勤2小时的试 面随时加班的试 ...... 今年的“金三银四”被网友们称为“铜三铁四”, 招聘软件上的岗位都能背下来了,简历却依然石沉大海。 好不容易等来个回复,还不如不回复 或者是遇到

    2023年04月23日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包