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

LeetCode 刷题【126. 单词接龙 II】

126. 单词接龙 II

自己做

解:递归选取(超时)

class Solution {private int min_len = Integer.MAX_VALUE;private List<Boolean> choice;                       //标记是否选取private List<List<String>> res;                     //存在结果public void searchWord(String endWord, List<String> wordList, List<Boolean> option, List<String> combine){if(combine.size() > min_len)                            //比最短组合长也没必要继续往下延伸了return;List<String> combination = new ArrayList(combine);      List<Boolean> choice = new ArrayList(option);if(combination.get(combination.size() - 1).equals(endWord)){ //组合中最后一个元素和endWord相同即找到了对应组合if(res.size() == 0){                                //第一个组合,直接加入res.add(combination);min_len = combination.size();    }else{                                               //不是第一个组合,综合考虑if(combination.size() < min_len){               //找到了更短的序列,更新resmin_len = combination.size();//清空以前的结果,以目前最短的为准res = new ArrayList();res.add(combination);}else if(combination.size() == min_len)          //找到了同样短的序列,加入resres.add(combination);//比最短组合长的组合就不考虑了}return;}//选取这一层的元素for(int i = 0; i < wordList.size(); i++){if(!choice.get(i)){                                        //没有被选取过的元素//检查上个单词和当前单词不一样的字母数int num = 0;for(int j = 0; j < combination.get(combination.size() - 1).length(); j++)if(wordList.get(i).charAt(j) != combination.get(combination.size() - 1).charAt(j))num++;if(num == 1){                                          //相差一个字母,尝试选取combination.add(wordList.get(i));choice.set(i, true);searchWord(endWord, wordList, choice, combination);           //放入组合choice.set(i, false);combination.remove(combination.size() - 1);}//除此之外都不选取}}}public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {//检查endWord是否在wordList中boolean is_exist = false;choice = new ArrayList();       for(int i = 0; i < wordList.size(); i++){           //检查的同时顺便初始化choiceif(endWord.equals(wordList.get(i)))              //存在is_exist = true;choice.add(false);}if(!is_exist)                                   //不存在就直接返回return new ArrayList();res = new ArrayList();List<String> combination = new ArrayList<String>();combination.add(beginWord);searchWord(endWord, wordList, choice, combination);return res;}
}

看题解

class Solution {public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {List<List<String>> res = new ArrayList<>();// 因为需要快速判断扩展出的单词是否在 wordList 里,因此需要将 wordList 存入哈希表,这里命名为「字典」Set<String> dict = new HashSet<>(wordList);// 特殊用例判断if (!dict.contains(endWord)) {return res;}dict.remove(beginWord);// 第 1 步:广度优先搜索建图// 记录扩展出的单词是在第几次扩展的时候得到的,key:单词,value:在广度优先搜索的第几层Map<String, Integer> steps = new HashMap<String, Integer>();steps.put(beginWord, 0);// 记录了单词是从哪些单词扩展而来,key:单词,value:单词列表,这些单词可以变换到 key ,它们是一对多关系Map<String, List<String>> from = new HashMap<String, List<String>>();int step = 1;boolean found = false;int wordLen = beginWord.length();Queue<String> queue = new ArrayDeque<String>();queue.offer(beginWord);while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {String currWord = queue.poll();char[] charArray = currWord.toCharArray();// 将每一位替换成 26 个小写英文字母for (int j = 0; j < wordLen; j++) {char origin = charArray[j];for (char c = 'a'; c <= 'z'; c++) {charArray[j] = c;String nextWord = String.valueOf(charArray);if (steps.containsKey(nextWord) && step == steps.get(nextWord)) {from.get(nextWord).add(currWord);}if (!dict.contains(nextWord)) {continue;}// 如果从一个单词扩展出来的单词以前遍历过,距离一定更远,为了避免搜索到已经遍历到,且距离更远的单词,需要将它从 dict 中删除dict.remove(nextWord);// 这一层扩展出的单词进入队列queue.offer(nextWord);// 记录 nextWord 从 currWord 而来from.putIfAbsent(nextWord, new ArrayList<>());from.get(nextWord).add(currWord);// 记录 nextWord 的 stepsteps.put(nextWord, step);if (nextWord.equals(endWord)) {found = true;}}charArray[j] = origin;}}step++;if (found) {break;}}// 第 2 步:回溯找到所有解,从 endWord 恢复到 beginWord ,所以每次尝试操作 path 列表的头部if (found) {Deque<String> path = new ArrayDeque<>();path.add(endWord);backtrack(from, path, beginWord, endWord, res);}return res;}public void backtrack(Map<String, List<String>> from, Deque<String> path, String beginWord, String cur, List<List<String>> res) {if (cur.equals(beginWord)) {res.add(new ArrayList<>(path));return;}for (String precursor : from.get(cur)) {path.addFirst(precursor);backtrack(from, path, beginWord, precursor, res);path.removeFirst();}}
}、

http://www.dtcms.com/a/507244.html

相关文章:

  • 防火墙规则设置
  • 江协科技STM32课程笔记(五)— ADC模数转换器
  • 什么是慢查询,慢请求,以及如何避免
  • 网站设计模板简约福州网站设计
  • 各大网站做推广广告什么是企业形象设计
  • 大模型金融量化比赛
  • Kubernetes深入学习之容器入门(一)
  • Docker安装部署MrDoc觅思文档-免费的国产知识库管理系统
  • 批量更新操作全攻略:从JDBC原理到多框架实现(MyBatis/MyBatis-Plus/Nutz)
  • 简述:普瑞时空数据建库软件(国土变更建库)之一(2025年部分新规则)
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十二)Python编程之面向对象
  • 刚学做网站怎么划算普洱专业企业网站建设
  • Java基础——面向对象复习知识点12
  • IPv6路由技术
  • 网站建设开票开什么内容电脑禁止访问网站设置
  • WPeChatGPT 插件使用教程(转载)
  • 从 Sora 到 Sora 2:文本生成视频进入下一个阶段(附sora教程)
  • k8s(十二)Rancher详解
  • 4. 前馈网络(FeedForward):给每个词“做深度加工”
  • wordpress一步步建企业网站上海有名的广告设计公司
  • 百度搜索站长平台汽车网站建设目的
  • EDA--三井物产商品预测挑战赛 Exploratory Data Analysis(探索性数据分析)
  • 【云计算专题会议】第二届云计算与大数据国际学术会议(ICCBD 2025)
  • AI CRM中的数据分析:悟空AI CRM如何帮助企业优化运营
  • Git多项目提交记录提取与数据分析指南
  • 网站后台账号密码忘记了怎么办漳平网络建站公司
  • 响水做网站价格上海网站设计成功柚v米科技
  • Elasticsearch面试精讲 Day 26:集群部署与配置最佳实践
  • 搭建Jenkins
  • 多语言NLP数据处理:核心环节与实践要点