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

在福州做搬家网站多少钱网站正在建设中页面

在福州做搬家网站多少钱,网站正在建设中页面,企业网站整理优化,网络开发定制一、题目 字典wordList中从单词beginWord和endWord的 转换序列 是一个按下述规格形成的序列beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 1、每一对相邻的单词只差一个字母。 2、对于1 < i < k时&#xff0c;每个si都在wordList中。注意&#xff0c;beg…

一、题目

字典wordList中从单词beginWordendWord的 转换序列 是一个按下述规格形成的序列beginWord -> s1 -> s2 -> ... -> sk
1、每一对相邻的单词只差一个字母。
2、对于1 <= i <= k时,每个si都在wordList中。注意,beginWord不需要在wordList中。
3、sk == endWord

给你两个单词beginWordendWord和一个字典wordList,返回从beginWordendWord的最短转换序列中的单词数目 。如果不存在这样的转换序列,返回0

示例 1:
输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是hit->hot-> dot -> dog -> cog, 返回它的长度5

示例 2:
输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord cog不在字典中,所以无法进行转换。

1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWordendWordwordList[i]由小写英文字母组成
beginWord != endWord
wordList中的所有字符串 互不相同

二、代码

【1】广度优先搜索 + 优化建图: 本题要求的是最短转换序列的长度,看到最短首先想到的就是广度优先搜索。想到广度优先搜索自然而然的就能想到图,但是本题并没有直截了当的给出图的模型,因此我们需要把它抽象成图的模型。我们可以把每个单词都抽象为一个点,如果两个单词可以只改变一个字母进行转换,那么说明他们之间有一条双向边。因此我们只需要把满足转换条件的点相连,就形成了一张图。

基于该图,我们以beginWord为图的起点,以endWord为终点进行广度优先搜索,寻找beginWordendWord的最短路径。

基于上面的思路我们考虑如何编程实现。首先为了方便表示,我们先给每一个单词标号,即给每个单词分配一个id。创建一个由单词wordid对应的映射wordId,并将beginWordwordList中所有的单词都加入这个映射中。之后我们检查endWord是否在该映射内,若不存在,则输入无解。我们可以使用哈希表实现上面的映射关系。

然后我们需要建图,依据朴素的思路,我们可以枚举每一对单词的组合,判断它们是否恰好相差一个字符,以判断这两个单词对应的节点是否能够相连。但是这样效率太低,我们可以优化建图。具体地,我们可以创建虚拟节点。对于单词hit,我们创建三个虚拟节点*ith*thi*,并让hit向这三个虚拟节点分别连一条边即可。如果一个单词能够转化为hit,那么该单词必然会连接到这三个虚拟节点之一。对于每一个单词,我们枚举它连接到的虚拟节点,把该单词对应的id与这些虚拟节点对应的id相连即可。

最后我们将起点加入队列开始广度优先搜索,当搜索到终点时,我们就找到了最短路径的长度。注意因为添加了虚拟节点,所以我们得到的距离为实际最短路径长度的两倍。同时我们并未计算起点对答案的贡献,所以我们应当返回距离的一半再加一的结果。

class Solution {Map<String, Integer> wordId = new HashMap<String, Integer>();List<List<Integer>> edge = new ArrayList<List<Integer>>();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;}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> que = new LinkedList<Integer>();que.offer(beginId);while (!que.isEmpty()) {int x = que.poll();if (x == endId) {return dis[endId] / 2 + 1;}for (int it : edge.get(x)) {if (dis[it] == Integer.MAX_VALUE) {dis[it] = dis[x] + 1;que.offer(it);}}}return 0;}public void addEdge(String word) {addWord(word);int id1 = wordId.get(word);char[] array = word.toCharArray();int length = array.length;for (int i = 0; i < length; ++i) {char tmp = 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] = tmp;}}public void addWord(String word) {if (!wordId.containsKey(word)) {wordId.put(word, nodeNum++);edge.add(new ArrayList<Integer>());}}
}

时间复杂度: O(N×C^2)。其中NwordList的长度,C为列表中单词的长度。
1、建图过程中,对于每一个单词,我们需要枚举它连接到的所有虚拟节点,时间复杂度为O(C),将这些单词加入到哈希表中,时间复杂度为O(N×C),因此总时间复杂度为O(N×C)
2、广度优先搜索的时间复杂度最坏情况下是O(N×C)。每一个单词需要拓展出O(C)个虚拟节点,因此节点数O(N×C)
空间复杂度: O(N×C^2)。其中NwordList的长度,C为列表中单词的长度。哈希表中包含O(N×C)个节点,每个节点占用空间O(C),因此总的空间复杂度为O(N×C^2)

双向广度优先搜索: 根据给定字典构造的图可能会很大,而广度优先搜索的搜索空间大小依赖于每层节点的分支数量。假如每个节点的分支数量相同,搜索空间会随着层数的增长指数级的增加。考虑一个简单的二叉树,每一层都是满二叉树的扩展,节点的数量会以2为底数呈指数增长。如果使用两个同时进行的广搜可以有效地减少搜索空间。一边从beginWord开始,另一边从endWord开始。我们每次从两边各扩展一层节点,当发现某一时刻两边都访问过同一顶点时就停止搜索。这就是双向广度优先搜索,它可以可观地减少搜索空间大小,从而提高代码运行效率。

class Solution {Map<String, Integer> wordId = new HashMap<String, Integer>();List<List<Integer>> edge = new ArrayList<List<Integer>>();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;}int[] disBegin = new int[nodeNum];Arrays.fill(disBegin, Integer.MAX_VALUE);int beginId = wordId.get(beginWord);disBegin[beginId] = 0;Queue<Integer> queBegin = new LinkedList<Integer>();queBegin.offer(beginId);int[] disEnd = new int[nodeNum];Arrays.fill(disEnd, Integer.MAX_VALUE);int endId = wordId.get(endWord);disEnd[endId] = 0;Queue<Integer> queEnd = new LinkedList<Integer>();queEnd.offer(endId);while (!queBegin.isEmpty() && !queEnd.isEmpty()) {int queBeginSize = queBegin.size();for (int i = 0; i < queBeginSize; ++i) {int nodeBegin = queBegin.poll();if (disEnd[nodeBegin] != Integer.MAX_VALUE) {return (disBegin[nodeBegin] + disEnd[nodeBegin]) / 2 + 1;}for (int it : edge.get(nodeBegin)) {if (disBegin[it] == Integer.MAX_VALUE) {disBegin[it] = disBegin[nodeBegin] + 1;queBegin.offer(it);}}}int queEndSize = queEnd.size();for (int i = 0; i < queEndSize; ++i) {int nodeEnd = queEnd.poll();if (disBegin[nodeEnd] != Integer.MAX_VALUE) {return (disBegin[nodeEnd] + disEnd[nodeEnd]) / 2 + 1;}for (int it : edge.get(nodeEnd)) {if (disEnd[it] == Integer.MAX_VALUE) {disEnd[it] = disEnd[nodeEnd] + 1;queEnd.offer(it);}}}}return 0;}public void addEdge(String word) {addWord(word);int id1 = wordId.get(word);char[] array = word.toCharArray();int length = array.length;for (int i = 0; i < length; ++i) {char tmp = 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] = tmp;}}public void addWord(String word) {if (!wordId.containsKey(word)) {wordId.put(word, nodeNum++);edge.add(new ArrayList<Integer>());}}
}

时间复杂度: O(N×C^2)。其中NwordList的长度,C为列表中单词的长度。
1、建图过程中,对于每一个单词,我们需要枚举它连接到的所有虚拟节点,时间复杂度为O(C),将这些单词加入到哈希表中,时间复杂度为O(N×C),因此总时间复杂度为O(N×C)
2、双向广度优先搜索的时间复杂度最坏情况下是O(N×C)。每一个单词需要拓展出O(C)个虚拟节点,因此节点数O(N×C)

空间复杂度: O(N×C^2)。其中NwordList的长度,C为列表中单词的长度。哈希表中包含O(N×C)个节点,每个节点占用空间O(C),因此总的空间复杂度为O(N×C^2)

http://www.yayakq.cn/news/496709/

相关文章:

  • 长沙企业做网站哪家好深圳平湖网站开发
  • 网银汇款企业做网站用途写什么网站建设 国鸿
  • 网站备案需要准备哪些资料饿了么网站做生鲜吗
  • vps网站如何设置缓存现在推广引流什么平台比较火
  • 广州做网页深圳网站建设seo推广优化
  • 网站手机版怎么做北京南站到故宫最佳路线
  • 住房建设城乡网站网站建设与设计毕业shej
  • 仪器仪表行业网站建设惠州外包网站建设
  • 做网站怎么添加点击事件汕头网站建设方案推广
  • 二级域名网站如何申请wordpress tag=
  • 代做毕业设计网站保定网站建设多少钱
  • 轻淘客网站模板知乎推广优化
  • 成都网站制作scgc西安企业建站系统模板
  • 宁波企业做网站哪家好wordpress 下载类主题
  • 网站网页打开的速度什么决定的php wordpress 漏洞
  • 访问网站速度慢商标设计logo网站
  • 常规网站建设内容知名网站都是什么系统做的
  • 汕尾住房和建设局网站新手做外贸怎么入门
  • 长沙微网站建设网址短链接在线生成免费
  • 网站建设与规划总结如何高效率的建设网站
  • 做ps合成的网站济南建设集团网站
  • 网站如何免费推广react企业网站模板
  • 商城网站网络公司做编程的+网站有哪些内容
  • 做淘宝客最好的网站是什么网站广州专业网站建设后台管理便捷
  • 建一个鲜花买卖网站多少钱wordpress本地访问满
  • 企业网站开发模板下载网页搭建
  • 国内设计师个人网站葫岛百度seo
  • 惠州响应式网站建设公司口碑最好的装修公司排行
  • 无障碍 网站 怎么做店面装修效果图
  • 网页做二维码哪个网站好做微课常用的网站有哪些