当前位置: 首页 > news >正文

127. 单词接龙

和433.最小基因变化这道题一样的解法。
https://blog.csdn.net/qq_43606119/article/details/135538247

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {Set<String> cnt = new HashSet<>();for (int i = 0; i < wordList.size(); ++i) {cnt.add(wordList.get(i));}if (!cnt.contains(endWord)) return 0;Set<String> visited = new HashSet<>();Queue<String> q = new ArrayDeque<>();q.offer(beginWord);visited.add(beginWord);int step = 1;while (!q.isEmpty()) {int size = q.size();for (int i = 0; i < size; ++i) {String curr = q.poll();for (int u = 0; u < curr.length(); ++u) {for (int v = 0; v < 26; ++v) {if (curr.charAt(u) != 'a' + v) {StringBuffer sb = new StringBuffer(curr);sb.setCharAt(u, (char)('a' + v));String next = sb.toString();if (!visited.contains(next) && cnt.contains(next)) {if (next.equals(endWord)) return step + 1;q.offer(next);visited.add(next);}}}}}++step;}return 0;}
}

改进:

在本题中可以使用虚拟节点将各个单词进行连接,例如hit可以有三个虚拟节点hi*、h*t、*it,将其和hit进行连接,所有单词都如此处理,优化建图。

注意因为添加了虚拟节点,所以我们得到的距离为实际最短路径长度的两倍。同时我们并未计算起点对答案的贡献,所以我们应当返回距离的一半再加一的结果。

class Solution {Map<String, Integer> wordID = new HashMap<>();List<List<Integer>> edge = new ArrayList<>();int nodeNum = 0;public int ladderLength(String beginWord, String endWord, List<String> wordList) {for (String word : wordList) {addEdge(word);}addEdge(beginWord);if (!wordID.containsKey(endWord)) {return 0;}// 初始化dis数组,表示从beginWord到每个单词的最短转变路径长度,初始值为Integer.MAX_VALUE。int[] dis = new int[nodeNum];Arrays.fill(dis, Integer.MAX_VALUE);int beginID = wordID.get(beginWord), endID = wordID.get(endWord);dis[beginID] = 0;Queue<Integer> q = new LinkedList<>();q.offer(beginID);while (!q.isEmpty()) {int curr = q.poll();if (curr == endID) return dis[curr] / 2 + 1;for (int e : edge.get(curr)) {if (dis[e] == Integer.MAX_VALUE) {dis[e] = dis[curr] + 1;q.offer(e);}}}return 0;}private void addEdge(String word) {addWord(word);int id1 = wordID.get(word);char[] array = word.toCharArray();for (int i = 0; i < array.length; ++i) {char temp = array[i];array[i] = '*';String newWord = new String(array);addWord(newWord);int id2 = wordID.get(newWord);edge.get(id1).add(id2);edge.get(id2).add(id1);array[i] = temp;}}private void addWord(String word) {if (!wordID.containsKey(word)) {wordID.put(word, nodeNum++);edge.add(new ArrayList<Integer>());}}
}
http://www.lryc.cn/news/278202.html

相关文章:

  • 计算机算法贪心算法
  • 基于css实现动画效果
  • 18.将文件上传至云服务器 + 优化网站的性能
  • Linux: module: kheaders;CONFIG_IKHEADERS
  • Page 251~254 Win32 GUI项目
  • Kafka(七)可靠性
  • Spring Data JPA入门到放弃
  • MES系统数据采集的几种方式
  • 铭文 LaunchPad 平台 Solmash 推出早鸟激励计划
  • 【前端规范】
  • 12、JVM高频面试题
  • 【Docker】Docker安装入门教程及基本使用
  • 语义解析:如何基于SQL去实现自然语言与机器智能连接的桥梁
  • Java项目:117SpringBoot动漫论坛网站
  • Jenkins基础篇--添加节点
  • 【C++】手撕 list类(包含迭代器)
  • @Autowired 和 @Resource 的区别是什么?
  • 栈和排序.
  • springboot 多数据源怎么配置在控制台的sql打印日志
  • 【WinForms 窗体】常见的“陷阱”
  • Android readelf 工具查找函数符号
  • MySQL-索引回顾
  • 重新认识Elasticsearch-一体化矢量搜索引擎
  • 【附源码】基于SSM框架的房屋租赁系统的设计与实现
  • [SpringBoot]如何在一个普通类中获取一个Bean
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • EasyMR:为 AI 未来赋能,打造弹性大数据引擎的革命
  • C //练习 4-10 另一种方法是通过getline函数读入整个输入行,这种情况下可以不使用getch与ungetch函数。请运用这一方法修改计算器程序。
  • 竞赛保研 基于深度学习的行人重识别(person reid)
  • Ncast盈可视 高清智能录播系统 IPSetup.php信息泄露+RCE漏洞复现(CVE-2024-0305)