题目I描述

https://leetcode-cn.com/problems/word-ladder

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:

如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 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" 不在字典中,所以无法进行转换。

思路:求最短长度,用BFS,逐层寻找与上一层只差一个字符的单词,当单词与目标单词一致时返回当前层数

import java.util.*;
class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {if(!wordList.contains(endWord)){//若字典中没有endWord,则返回0return 0;}int res=1;//初始层数wordList.remove(beginWord);//在原字典中去掉beginWordQueue<String> queue=new LinkedList<String>();//用队列存储每层的单词queue.add(beginWord);while(!queue.isEmpty()){int size=queue.size();//读取当前层有多少个单词需要遍历while(size>0){String temp=queue.poll();if(temp.equals(endWord)){//如果和目标单词一致则返回层数return res;}find(queue,temp,wordList);//找到wordList中和当前单词只差一位的单词加入队列size--;//每遍历一个单词减一}res++;//当前层遍历完,层数加一}return 0;//如果遍历完没有输出则输出0}public void find(Queue<String> queue,String temp,List<String> wordList){for(int i=0;i<wordList.size();i++){String s=wordList.get(i);int count=0;for(int m=0;m<s.length();m++){if(temp.charAt(m)!=s.charAt(m)){count++;}}if(count==1){//如果当前单词和temp只差一位queue.add(s);//将其加入队列wordList.remove(s);//从wordList中移除这个单词i--;//移除后wordList中所有的会向前移一位,故i--保证从下一个开始遍历}}}
}

题目描述

https://leetcode-cn.com/problems/word-ladder-ii

给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:

每次转换只能改变一个字母。
转换过程中的中间单词必须是字典中的单词。
说明:

如果不存在这样的转换序列,返回一个空列表。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例 1:

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

输出:
[
  ["hit","hot","dot","dog","cog"],
  ["hit","hot","lot","log","cog"]
]
示例 2:

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

输出: []

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

思路:先BFS求最小长度,再DFS遍历求符合长度的解

import java.util.*;
class Solution {List<List<String>> res=new ArrayList<List<String>>();public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {if(!wordList.contains(endWord)){return res;}wordList.remove(beginWord);List<String> newwordList=new ArrayList<String>();//复制一个wordList用于BFS求长度for(int i=0;i<wordList.size();i++){String temp=wordList.get(i);newwordList.add(temp);}int minnum=findnum(beginWord, endWord, newwordList);//求最小长度List<String> list=new ArrayList<String>();list.add(beginWord);dfs(beginWord,endWord,wordList,list,res,minnum);//DFS遍历return res;}public void dfs(String beginWord, String endWord, List<String> wordList,List<String> list,List<List<String>> res,int minnum){Queue<String> queue=new LinkedList<String>();queue=dfsfind(beginWord,wordList);while(!queue.isEmpty()){String temp=queue.poll();list.add(temp);if(temp.equals(endWord)){if(list.size()==minnum){res.add(new ArrayList(list));}}wordList.remove(temp);dfs(temp,endWord,wordList,list,res,minnum);wordList.add(temp);list.remove(temp);}return;}public Queue<String> dfsfind(String temp, List<String> newwordList){Queue<String> q=new LinkedList<String>();for(int i=0;i<newwordList.size();i++){String s=newwordList.get(i);int count=0;for(int m=0;m<s.length();m++){if(temp.charAt(m)!=s.charAt(m)){count++;}}if(count==1){q.add(s);}}return q;}public int findnum(String beginWord, String endWord, List<String> newwordList){Queue<String> queue=new LinkedList<String>();queue.add(beginWord);int num=1;while(!queue.isEmpty()){int size=queue.size();while(size>0){String temp=queue.poll();if(temp.equals(endWord)){return num;}find(temp,newwordList,queue);size--;}num++;}return 0;}public void find(String temp, List<String> newwordList,Queue<String> queue){for(int i=0;i<newwordList.size();i++){String s=newwordList.get(i);int count=0;for(int m=0;m<s.length();m++){if(temp.charAt(m)!=s.charAt(m)){count++;}}if(count==1){queue.add(s);newwordList.remove(s);i--;}}}
}

单词接龙java实现相关推荐

  1. Java 算法 单词接龙

    目录标题 题目描述 解题思路 代码 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个 ...

  2. java -英语单词接龙

    设计思想: 将文件中的单词存入ArrayList数组中,分为前后两个数组,读入单词,经单词字母分解并且通过循环比较单词字母是否相同,相同写入结果文件,不同继续比较,直至找到最大接龙单词长度. 源程序代 ...

  3. java:单词接龙(dfs)(重点看看:包括相同单词不包含,还有找到第一个相同的开头单词相同的字母,连接字符串重复部分删除)

    java:单词接龙 题目 问题描述单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在 ...

  4. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  5. java单词接龙,LeetCode-127.单词接龙(Word Ladder)

    127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: 序列中第一个单词是 beginWord .序列中最后一个单词是 ...

  6. 单词接龙 单词接龙的规则是

    注意!答案仅作为参考(实际考试中下列代码通过用例100%,但不代表最优解) 单词接龙的规则是 可用于接龙的单词 首字母必须要与前一个单词的尾字母相同 当存在多个首字母相同的单词时,取长度最长的单词 如 ...

  7. 【每日一算法】单词接龙

    微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...

  8. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  9. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

最新文章

  1. 【最短路】 ZOJ 1544 Currency Exchange 推断负圈
  2. 利用线性链表基本操作完成两个有序线性表的合并
  3. docker镜像为什么要采用分层结构
  4. Firefox 10正式发布
  5. 集合的划分(信息学奥赛一本通-T1315)
  6. ico图标下载 ico大全_我们可以做些什么来向ICO投资者保证我们不会用他们的钱消失...
  7. 安装完centos6没有eth0,只有回环地址
  8. 新手如何从零开始入门前端开发,分享我的学习方法!
  9. html5 数据懒加载图片,Jsoup+HtmlUnit获取懒加载数据
  10. GO语言学习之路19
  11. POJ 1365 Prime Land
  12. [9018_1563][bzoj_2144]跳跳棋
  13. 静态的通讯录(C语言)
  14. sqlalchemy入门记录
  15. 使用Spring Cache设置缓存条件
  16. Windows 10 修改桌面图标三(文件夹图标)
  17. 第三方登录 人人php,php 使用curl模拟登录人人(校内)网的简单实例
  18. 【计算机网络】TCP糊涂窗口综合症
  19. 【Java写的碰碰球游戏(2) 】
  20. 网络攻击知识之几种IP地址攻击方式

热门文章

  1. 数学和中国文学的比较
  2. 开发中遇到的bug-Uncaught TypeError: $(...).css is not a function
  3. 专业排版字号、磅数与实际尺寸对照表
  4. 手机号码和电话号码的正则表达式
  5. 诚实的人与说谎的人(Java)
  6. Schillace 定律 背后的 Sam Schillace
  7. 【毕设记录】异质性检验
  8. Java语言编写扑克牌小游戏
  9. SAP ABAP发布HTTP RESTFUL服务
  10. Remix OS for PC