2019独角兽企业重金招聘Python工程师标准>>>

EXAMPLE
Input: DAMP, LIKE
Output: DAMP -> LAMP -> LIMP -> LIME -> LIKE

思路:

这其实就是广度优先遍历。遍历过程中,我们需要记录路径,在找到目标单词后,根据记录的路径打印出变形过程。

BFS的变形体。对起始单词的每一个字母都做替换,把替换后的单词加入到queue中,并同时维护一个Map来记录变化前单词和变化后单词的联系。用来回溯时能打印出路径。

[java] view plain copy

  1. package Hard;
  2. import java.util.HashSet;
  3. import java.util.LinkedList;
  4. import java.util.Map;
  5. import java.util.Queue;
  6. import java.util.Set;
  7. import java.util.TreeMap;
  8. import java.util.TreeSet;
  9. /**
  10. * Given two words of equal length that are in a dictionary,  write a method to  trans-
  11. form  one word into another word by changing only one letter at a time. The new
  12. word you get in each step must be in the dictionary.
  13. 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。
  14. 一次只能转换一个字母,且每次生成的单词必须在字典内
  15. *
  16. */
  17. public class S18_10 {
  18. public static LinkedList<String> transform(String startWord, String stopWord, Set<String> dictionary) {
  19. startWord = startWord.toUpperCase();
  20. stopWord = stopWord.toUpperCase();
  21. Queue<String> actionQueue = new LinkedList<String>();
  22. Set<String> visitedSet = new HashSet<String>();
  23. Map<String, String> backtrackMap = new TreeMap<String, String>();
  24. actionQueue.add(startWord);
  25. visitedSet.add(startWord);
  26. while (!actionQueue.isEmpty()) {
  27. String w = actionQueue.poll();
  28. // For each possible word v from w with one edit operation
  29. for (String v : getOneEditWords(w)) {
  30. if (v.equals(stopWord)) {       // Found our word! Now, back track.
  31. LinkedList<String> list = new LinkedList<String>();
  32. list.add(v);        // Append v to list
  33. while (w != null) {
  34. list.add(0, w);
  35. w = backtrackMap.get(w);
  36. }
  37. return list;
  38. }
  39. // If v is a dictionary word
  40. if (dictionary.contains(v)) {
  41. if (!visitedSet.contains(v)) {
  42. actionQueue.add(v);
  43. visitedSet.add(v);          // mark visited
  44. backtrackMap.put(v, w); // w is the previous state of v
  45. }
  46. }
  47. }
  48. }
  49. return null;
  50. }
  51. // 改变word的某一个字母
  52. private static Set<String> getOneEditWords(String word) {
  53. Set<String> words = new TreeSet<String>();
  54. for (int i = 0; i < word.length(); i++) {        // for every letter
  55. char[] wordArray = word.toCharArray();
  56. // change that letter to something else
  57. for (char c = 'A'; c <= 'Z'; c++) {
  58. if (c != word.charAt(i)) {
  59. wordArray[i] = c;
  60. words.add(new String(wordArray));
  61. }
  62. }
  63. }
  64. return words;
  65. }
  66. public static HashSet<String> setupDictionary(String[] words) {
  67. HashSet<String> hash = new HashSet<String>();
  68. for (String word : words) {
  69. hash.add(word.toUpperCase());
  70. }
  71. return hash;
  72. }
  73. public static void main(String[] args) {
  74. String[] words = { "maps", "tan", "tree", "apple", "cans", "help",
  75. "aped", "free", "apes", "flat", "trap", "fret", "trip", "trie",
  76. "frat", "fril" };
  77. HashSet<String> dict = setupDictionary(words);
  78. LinkedList<String> list = transform("tree", "flat", dict);
  79. for (String word : list) {
  80. System.out.println(word);
  81. }
  82. }
  83. }

转载于:https://my.oschina.net/u/2822116/blog/795774

给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...相关推荐

  1. 需求:给定两个整数,被除数和除数(都是正数,且不能超过int的范围),将两数相除,要求不使用乘法,除法和 % 运算,得到商和余数

    package com.itheima.day04.test;public class Test18 {public static void main(String[] args) {/*分析:被除数 ...

  2. python如何统计字典里面健的数量_Python中使用Counter进行字典创建以及key数量统计的方法...

    Python中使用Counter进行字典创建以及key数量统计的方法 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python中使用Counter进行字典创建以及key数量统计 ...

  3. java继承实现不用每个类都写toString方法

    每个类都写toString方法很麻烦,采用继承可以很好的解决 import java.io.Serializable;import org.apache.commons.lang.builder.To ...

  4. 给定两个数组arrx和arry,长度都为N。代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点?

    问题描述: 给定两个数组arrx和arry,长度都为N.代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点? 思想 坐标系中两个点 ...

  5. 2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow

    2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow ...

  6. 一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java

    题目描述:一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数.现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么? 输入格式:输入一个整数 c ...

  7. matlab rand randn 每次生成的随机数都一样的解决方案

    文章目录 问题说明 解决方案 例子 生成不重复的随机数 生成重复的随机数 结论 参考文献 问题说明 在Matlab应用中,我们经常需要用到随机数,比如rand(),randn()等函数,都是生成某一类 ...

  8. (C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数

    给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数 思路 logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有: A[midA ...

  9. Bailian3712 电话号码生成英语单词【查表】

    3712:电话号码生成英语单词 总时间限制: 1000ms 内存限制: 65536kB 描述 我们知道手机键盘上一般可以用于输入字母,2可以输入a,b,c,3可以输入d,e,f,4可以输入g,h,i, ...

最新文章

  1. GridView单元格取值显示为nbsp;
  2. HDLBits 系列(21)LFSR(线性反馈移位寄存器)
  3. 步步为营 .NET 代码重构学习笔记 十一
  4. php 如何实现表格行列的对齐,excel怎样把每列文字对齐
  5. python官方-Python官方中文文档强势来袭
  6. C++中的继承(三)
  7. mysql 自身参照自身_mysql个人散乱笔记,慎重参考
  8. SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置
  9. python与财务工作总结_Python小结1
  10. c语言 wchar_t,一个【wchar_t】引发的学案
  11. 一图读懂开源协议_一张经典图,开源协议比较
  12. css 背景色半透明 子元素不透明
  13. POCO C++库学习和分析 -- 线程 (二)
  14. 怎么查自己电脑服务器信息吗,怎么查看自己云服务器信息吗
  15. SVN 安装与使用教程 2020年9月更新最新教程
  16. 用命令提示符使用MySQL
  17. PC上无法捕捉vlan tag的原因
  18. 占坑:fullpage.js 在edge浏览器上上下移动鼠标(不滚动滚轮)会翻页的问题
  19. Git--建立和解除与远程仓库的关联
  20. 安装文件时显示不能打开要写入的文件该如何解决?

热门文章

  1. 2022年系统集成项目管理工程师考试,需要知道这些
  2. 财务数据中台架构及建设方案(ppt)
  3. 编辑商品按钮显示商品对应数据
  4. C4D骨骼动画绑定到像素
  5. JSAPI支付——H5网页端调起支付接口
  6. 精选优美英文短文1——Dear Basketball(亲爱的篮球)
  7. ROS机器人Diego 1#制作(十四)机械臂的控制---arduino驱动
  8. 学成在线 nuxt.js出现localhost 发送的响应无效。 ERR_INVALID_HTTP_RESPONSE 寻求大佬解决
  9. QT 中控件缩放比列设置
  10. win10 右键卡顿问题