LeetCode 题解(95): Word Ladder II

2024-05-28 09:18
文章标签 leetcode ii 题解 word 95 ladder

本文主要是介绍LeetCode 题解(95): Word Ladder II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) fromstart toend, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

Return

  [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters
题解:

先用BFS生成由start至end的hash table。

再用DFS递归查找所有路径。

第一步的核心数据结构是HashMap<String, HashSet<String>>,表示由String可以通过改变一个字符所能转化的所有字符Set。

注意替换字符再在set中查找的优化,否则超时。

C++版:

class Solution {
public:vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {vector<vector<string>> results; if(start.length() == 0 || end.length() == 0 || dict.size() == 0)return results;dict.insert(end);dict.insert(start);unordered_map<string, unordered_set<string>> trace;for(auto i : dict) {unordered_set<string> temp;trace.insert(pair<string, unordered_set<string>>(i, temp));}unordered_set<string> q1, q2, visited;q1.insert(end);bool found = false;while(q1.size() != 0 && !found) {for(auto i : q1)visited.insert(i);for(auto current : q1) {for(int i = 0; i < current.length(); i++) {for(char j = 'a'; j <= 'z'; j++) {string temp = current;temp[i] = j;if(visited.find(temp) == visited.end() && dict.find(temp) != dict.end()) {if(temp == start)found = true;q2.insert(temp);trace[temp].insert(current);}}}}q1 = q2;q2.clear();}vector<string> result;if(found)findPaths(trace, result, results, start);return results;}void findPaths(unordered_map<string, unordered_set<string>>& trace, vector<string>& result, vector<vector<string>>& results, string& start) {vector<string> extendedResult = result;extendedResult.push_back(start);if(trace[start].size() == 0) {results.push_back(extendedResult);return;}for(auto i : trace[start]) {findPaths(trace, extendedResult, results, i);}}
};

Java版:

public class Solution {public List<List<String>> findLadders(String start, String end, Set<String> dict) {List<List<String>> results = new ArrayList<List<String>>();if(start.isEmpty() || end.isEmpty() || dict.isEmpty())return results;Set<String> q1 = new HashSet<>();Map<String, Set<String>> p = new HashMap<>();q1.add(end);dict.add(end);dict.add(start);for(String i : dict) {Set<String> temp = new HashSet<>();p.put(i, temp);}Set<String> visited = new HashSet<>();boolean found = false;while(!q1.isEmpty() && !found) {for(String i : q1)visited.add(i);Set<String> q2 = new HashSet<>();for(String current : q1) {char[] curChar = current.toCharArray();for(int i = 0; i < current.length(); i++) {char original = curChar[i];for(char j = 'a'; j <= 'z'; j++) {curChar[i] = j;String newStr = new String(curChar);if(!visited.contains(newStr) && dict.contains(newStr)) {if(newStr.equals(start))found = true;p.get(newStr).add(current);q2.add(newStr);}}curChar[i] = original;}}q1 = q2;}List<String> result = new ArrayList<>();if(found)generateResult(result, start, p, results);return results;}void generateResult(List<String> result, String start, Map<String, Set<String>> p, List<List<String>> results) {List<String> extendedResult = new ArrayList<>(result);extendedResult.add(start);if(p.get(start).size() == 0) {results.add(extendedResult);return;}for(String s : p.get(start)) generateResult(extendedResult, s, p, results);}
}

Python版:

class Solution:# @param start, a string# @param end, a string# @param dict, a set of string# @return a list of lists of stringdef findLadders(self, start, end, dict):dict.add(start)dict.add(end)results, result, q1, visited, found, d = [], [], [end], set([end]), False, {word : [] for word in dict}if len(start) == 0 or len(end) == 0 or len(dict) == 0:return resultswhile len(q1) != 0 and not found:for i in q1:visited.add(i)q2 = set([])for current in q1:for i in range(len(current)):for j in "abcdefghijklmnopqrstuvwxyz":candidate = current[0:i] + j + current[i+1:]if candidate not in visited and candidate in dict:if candidate == start:found = Trueq2.add(candidate)d[candidate].append(current)q1 = q2if found:self.findPaths(results, result, d, start)return resultsdef findPaths(self, results, result, d, start):extendedResult = copy.copy(result)extendedResult.append(start)if not d[start]:results.append(extendedResult)returnfor i in d[start]:self.findPaths(results, extendedResult, d, i)


这篇关于LeetCode 题解(95): Word Ladder II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010151

相关文章

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

如何Python使用设置word的页边距

《如何Python使用设置word的页边距》在编写或处理Word文档的过程中,页边距是一个不可忽视的排版要素,本文将介绍如何使用Python设置Word文档中各个节的页边距,需要的可以参考下... 目录操作步骤代码示例页边距单位说明应用场景与高级用China编程途小结在编写或处理Word文档的过程中,页边距是一个

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方