博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode-126-Word Ladder II
阅读量:6679 次
发布时间:2019-06-25

本文共 2556 字,大约阅读时间需要 8 分钟。

算法描述:

Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, such that:

  1. Only one letter can be changed at a time
  2. Each transformed word must exist in the word list. Note that beginWord is not a transformed word.

Note:

  • Return an empty list if there is no such transformation sequence.
  • All words have the same length.
  • All words contain only lowercase alphabetic characters.
  • You may assume no duplicates in the word list.
  • You may assume beginWord and endWord are non-empty and are not the same.

Example 1:

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

Example 2:

Input:beginWord = "hit"endWord = "cog"wordList = ["hot","dot","dog","lot","log"]Output: []Explanation: The endWord "cog" is not in wordList, therefore no possible transformation. 解题思路:这道题比较难。深搜加广搜,广搜用于判断是否有通路,并构建连通图。深搜用于获取所有结果。
vector
> findLadders(string beginWord, string endWord, vector
& wordList) { unordered_set
dict(wordList.begin(),wordList.end()); dict.erase(beginWord); vector
> results; queue
que; que.push(beginWord); unordered_map
levels; unordered_map
> graph; int level = 0; bool isFound = true; while(!que.empty()){ level++; int levelSize = que.size(); for(int i=0; i< levelSize; i++){ string curWord = que.front(); que.pop(); string copyWord = curWord; for(int i=0; i < curWord.size(); i++){ char t = copyWord[i]; for(char c = 'a'; c <= 'z'; c++){ copyWord[i]=c; if(copyWord == curWord) continue; if(dict.find(copyWord)!=dict.end()){ levels[copyWord]=level+1; graph[curWord].push_back(copyWord); dict.erase(copyWord); if(copyWord==curWord){ isFound = true; }else{ que.push(copyWord); } }else{ auto it = levels.find(copyWord); if(it!=levels.end() && it->second == level+1){ graph[curWord].push_back(copyWord); } } copyWord[i]=t; } } } } if(isFound){ vector
temp({beginWord}); backtracking(results,temp,graph,beginWord,endWord); } return results; } void backtracking(vector
>& results,vector
& temp,unordered_map
> &graph,string beginWord,string endWord){ if(beginWord == endWord){ results.push_back(temp); return; } if(graph.find(beginWord)!=graph.end()){ for(auto curWord:graph[beginWord]){ temp.push_back(curWord); backtracking(results, temp, graph, curWord, endWord); temp.pop_back(); } } }

 

转载于:https://www.cnblogs.com/nobodywang/p/10396793.html

你可能感兴趣的文章
zabbix + RedHat7 安装配置指导
查看>>
Linux基础命令---显示主机名hostname
查看>>
ASP后门、***清理
查看>>
strtus2的xml文件配置
查看>>
Error:No suitable device found: no device found for connection
查看>>
SCCM 2016 为客户端分发管理组件Configuration Manager(一)
查看>>
CentOS 7 多网卡绑定
查看>>
python函数
查看>>
eclipse中要运行带参数的程序
查看>>
1.9-selinux介绍
查看>>
1.5-nagios监控客户端-1
查看>>
1.8-virsh常用操作
查看>>
Linux下高并发socket最大连接数所受的各种限制【转】
查看>>
Red Hat 6.2 64如何使用Centos的YUM源更新两种方法
查看>>
vim多行复制
查看>>
HIVE创建HBASE表
查看>>
k3cloud单据插件
查看>>
MaridDB主从复制,双主模型,半同步的配置
查看>>
麒麟开源堡垒机功能版本说明及升级方式说明
查看>>
交换机SPAN功能配置
查看>>