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

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF