给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...
2019独角兽企业重金招聘Python工程师标准>>>
EXAMPLE
Input: DAMP, LIKE
Output: DAMP -> LAMP -> LIMP -> LIME -> LIKE
思路:
这其实就是广度优先遍历。遍历过程中,我们需要记录路径,在找到目标单词后,根据记录的路径打印出变形过程。
BFS的变形体。对起始单词的每一个字母都做替换,把替换后的单词加入到queue中,并同时维护一个Map来记录变化前单词和变化后单词的联系。用来回溯时能打印出路径。
[java] view plain copy
- package Hard;
- import java.util.HashSet;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.Queue;
- import java.util.Set;
- import java.util.TreeMap;
- import java.util.TreeSet;
- /**
- * Given two words of equal length that are in a dictionary, write a method to trans-
- form 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.
- 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。
- 一次只能转换一个字母,且每次生成的单词必须在字典内
- *
- */
- public class S18_10 {
- public static LinkedList<String> transform(String startWord, String stopWord, Set<String> dictionary) {
- startWord = startWord.toUpperCase();
- stopWord = stopWord.toUpperCase();
- Queue<String> actionQueue = new LinkedList<String>();
- Set<String> visitedSet = new HashSet<String>();
- Map<String, String> backtrackMap = new TreeMap<String, String>();
- actionQueue.add(startWord);
- visitedSet.add(startWord);
- while (!actionQueue.isEmpty()) {
- String w = actionQueue.poll();
- // For each possible word v from w with one edit operation
- for (String v : getOneEditWords(w)) {
- if (v.equals(stopWord)) { // Found our word! Now, back track.
- LinkedList<String> list = new LinkedList<String>();
- list.add(v); // Append v to list
- while (w != null) {
- list.add(0, w);
- w = backtrackMap.get(w);
- }
- return list;
- }
- // If v is a dictionary word
- if (dictionary.contains(v)) {
- if (!visitedSet.contains(v)) {
- actionQueue.add(v);
- visitedSet.add(v); // mark visited
- backtrackMap.put(v, w); // w is the previous state of v
- }
- }
- }
- }
- return null;
- }
- // 改变word的某一个字母
- private static Set<String> getOneEditWords(String word) {
- Set<String> words = new TreeSet<String>();
- for (int i = 0; i < word.length(); i++) { // for every letter
- char[] wordArray = word.toCharArray();
- // change that letter to something else
- for (char c = 'A'; c <= 'Z'; c++) {
- if (c != word.charAt(i)) {
- wordArray[i] = c;
- words.add(new String(wordArray));
- }
- }
- }
- return words;
- }
- public static HashSet<String> setupDictionary(String[] words) {
- HashSet<String> hash = new HashSet<String>();
- for (String word : words) {
- hash.add(word.toUpperCase());
- }
- return hash;
- }
- public static void main(String[] args) {
- String[] words = { "maps", "tan", "tree", "apple", "cans", "help",
- "aped", "free", "apes", "flat", "trap", "fret", "trip", "trie",
- "frat", "fril" };
- HashSet<String> dict = setupDictionary(words);
- LinkedList<String> list = transform("tree", "flat", dict);
- for (String word : list) {
- System.out.println(word);
- }
- }
- }
转载于:https://my.oschina.net/u/2822116/blog/795774
给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...相关推荐
- 需求:给定两个整数,被除数和除数(都是正数,且不能超过int的范围),将两数相除,要求不使用乘法,除法和 % 运算,得到商和余数
package com.itheima.day04.test;public class Test18 {public static void main(String[] args) {/*分析:被除数 ...
- python如何统计字典里面健的数量_Python中使用Counter进行字典创建以及key数量统计的方法...
Python中使用Counter进行字典创建以及key数量统计的方法 来源:中文源码网 浏览: 次 日期:2018年9月2日 Python中使用Counter进行字典创建以及key数量统计 ...
- java继承实现不用每个类都写toString方法
每个类都写toString方法很麻烦,采用继承可以很好的解决 import java.io.Serializable;import org.apache.commons.lang.builder.To ...
- 给定两个数组arrx和arry,长度都为N。代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点?
问题描述: 给定两个数组arrx和arry,长度都为N.代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点? 思想 坐标系中两个点 ...
- 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 ...
- 一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java
题目描述:一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数.现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么? 输入格式:输入一个整数 c ...
- matlab rand randn 每次生成的随机数都一样的解决方案
文章目录 问题说明 解决方案 例子 生成不重复的随机数 生成重复的随机数 结论 参考文献 问题说明 在Matlab应用中,我们经常需要用到随机数,比如rand(),randn()等函数,都是生成某一类 ...
- (C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数
给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数 思路 logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有: A[midA ...
- Bailian3712 电话号码生成英语单词【查表】
3712:电话号码生成英语单词 总时间限制: 1000ms 内存限制: 65536kB 描述 我们知道手机键盘上一般可以用于输入字母,2可以输入a,b,c,3可以输入d,e,f,4可以输入g,h,i, ...
最新文章
- GridView单元格取值显示为nbsp;
- HDLBits 系列(21)LFSR(线性反馈移位寄存器)
- 步步为营 .NET 代码重构学习笔记 十一
- php 如何实现表格行列的对齐,excel怎样把每列文字对齐
- python官方-Python官方中文文档强势来袭
- C++中的继承(三)
- mysql 自身参照自身_mysql个人散乱笔记,慎重参考
- SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置
- python与财务工作总结_Python小结1
- c语言 wchar_t,一个【wchar_t】引发的学案
- 一图读懂开源协议_一张经典图,开源协议比较
- css 背景色半透明 子元素不透明
- POCO C++库学习和分析 -- 线程 (二)
- 怎么查自己电脑服务器信息吗,怎么查看自己云服务器信息吗
- SVN 安装与使用教程 2020年9月更新最新教程
- 用命令提示符使用MySQL
- PC上无法捕捉vlan tag的原因
- 占坑:fullpage.js 在edge浏览器上上下移动鼠标(不滚动滚轮)会翻页的问题
- Git--建立和解除与远程仓库的关联
- 安装文件时显示不能打开要写入的文件该如何解决?
热门文章
- 2022年系统集成项目管理工程师考试,需要知道这些
- 财务数据中台架构及建设方案(ppt)
- 编辑商品按钮显示商品对应数据
- C4D骨骼动画绑定到像素
- JSAPI支付——H5网页端调起支付接口
- 精选优美英文短文1——Dear Basketball(亲爱的篮球)
- ROS机器人Diego 1#制作(十四)机械臂的控制---arduino驱动
- 学成在线 nuxt.js出现localhost 发送的响应无效。 ERR_INVALID_HTTP_RESPONSE 寻求大佬解决
- QT 中控件缩放比列设置
- win10 右键卡顿问题