[CareerCup] 18.10 Word Transform 单词转换

18.10 Given two words of equal length that are in a dictionary, write a method to transform one word into another word by changing only one letter at a time. The new word you get in each step must be in the dictionary.

这道题让我们将一个单词转换成另一个单词,每次只能改变一个字母,让我们输出中间转换过程的单词。LeetCode上有类似的题目One Edit DistanceEdit Distance。我们的方法是写一个get_one_edit_words()函数,来返回某一个单词变动一个字母的所有可能情况,然后我们在transform函数中先将开始的单词存入一个队列queue中,还需要一个set来记录所有访问过的单词,还需要哈希表来建立当前单词和变换一步后的单词之间的映射,然后开始类似BFS的遍历,对于每一个单词,遍历get_one_edit_words()函数返回的结果,如果变换后的单词就是目标单词,则我们完成了变换,根据backtrack将整个路径上的单词存入结果中,如果变换单词不是目标单词,但是在字典中,如果没有在字典中,则我们将其排入queue,并加入visited,和建立哈希表的映射,继续遍历,参见代码如下:

set<string> get_one_edit_words(string word) {
    set<string> res;
    for (int i = 0; i < word.size(); ++i) {
        string t = word;
        for (char c = ‘a‘; c <= ‘z‘; ++c) {
            if (c != word[i]) {
                t[i] = c;
                res.insert(t);
            }
        }
    }
    return res;
}

vector<string> transform(string start, string end, set<string> dict) {
    queue<string> q;
    set<string> visited;
    unordered_map<string, string> backtrack;
    q.push(start);
    visited.insert(start);
    while (!q.empty()) {
        string w = q.front(); q.pop();
        for (string v : get_one_edit_words(w)) {
            if (v == end) {
                vector<string> res{v};
                while (!w.empty()) {
                    res.insert(res.begin(), w);
                    w = backtrack[w];
                }
                return res;
            }
            if (dict.count(v)) {
                if (!visited.count(v)) {
                    q.push(v);
                    visited.insert(v);
                    backtrack[v] = w;
                }
            }
        }
    }
    return {};
}

类似题目:

One Edit Distance

Edit Distance

CareerCup All in One 题目汇总

时间: 2024-10-22 08:58:33

[CareerCup] 18.10 Word Transform 单词转换的相关文章

对C++ Primer的10.3.9单词转换的思考

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.wines-

对C++ Primer的10.3.9单词转换的思考庄专租抓注缀

http://www.ebay.com/cln/r5d_thbr/2015-01-30/166738643014 http://www.ebay.com/cln/1vz_jbnv/2015-01-30/166653044017 http://www.ebay.com/cln/ntx_ntnd/2015-01-30/166918029011 http://www.ebay.com/cln/j19_tvlv/2015-01-30/166764397010 http://www.ebay.com/cl

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

18.06.02 POJ4128:单词序列 15年程设期末06

描述 给出两个单词(开始单词和结束单词)以及一个词典.找出从开始单词转换到结束单词,所需要的最短转换序列.转换的规则如下: 1.每次只能改变一个字母 2.转换过程中出现的单词(除开始单词和结束单词)必须存在于词典中 例如: 开始单词为:hit 结束单词为:cog 词典为:[hot,dot,dog,lot,log,mot] 那么一种可能的最短变换是: hit -> hot -> dot -> dog -> cog, 所以返回的结果是序列的长度5: 注意: 1.如果不能找到这种变换,则

CSS 3学习——transform 2D转换

首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒子发生了变换,该属性的默认值是"border-box",查MDN只有Firefox支持该属性(我试的没效果). CSS 3 中2D转换的实现用到两个属性: 属性 描述 CSS transform 向元素应用 2D 或 3D 转换. 3 transform-origin 指定变换的基点的位置

C++自学笔记_单词转换map对象_《C++ Primer》

今天在干<C++ Primer>第10章的时候似乎遇到了一点小瓶颈,翻回第8章吃了顿回头草.所以,老话说得好:欠下的总是要还滴 :) 一个小程序,很简单:单词转换程序:程序输入两个文件,第一个文件包括了若干单词对,没对的第一个单词将出现在输入的字符串中,而第二个单词 则是用于输出.本质上,这个文件提供的是单词转化的集合——在遇到第一个单词时,应该将之替换为第二个单词.第二个文件则提供了与要转换的文本. 打个比方:如果单词转换文件的内容为: 而要转换的文本是: Code: #include &l

18.04.08 luoguP1019 单词接龙

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单

java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档

原文:java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档 代码下载地址:http://www.zuidaima.com/share/1550463239670784.htm 可以通过预先设置指定的excel和word模板,通过替换文档里面指定的标志来生成新的excel和word文档.excel的部分只是实现了简单的方法.word部分可以支持word2003和word2007格式.建议word使用07及其以上. 其实excel部分标签和jstl很像,而且支持循环等.word就支

oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类型的数据:1.如果是整型,那么mysql中,用int即可:2.如果是带小数位的,那么mysql中可用numeric类型. 注:mysql中没有varchar2(10)和number这两个数据类型 二. Mysql varchar VS Oracle varchar2 mysql和oracle做数据同