搜索(BFS)---最短单词路径

最短单词路径

127. Word Ladder (Medium)

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

Output: 5

Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.
Input:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

Output: 0

Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.

题目描述:

??找出一条从beginword到endword的最短路径,每次移动规定为改变一个字符,并且改变之后的字符串必须在 wordList 中。

思路分析:

??采用BFS的思路找最短路径。

代码:

class Solution {
    public int ladderLength(String beginWord,String endWord,List<String>wordList){
    if(beginWord==null||endWord==null||beginWord.equals(endWord)||!wordList.contains(endWord))
        return 0;
    Queue<String>q=new LinkedList<>();//构造队列辅助BFS
    Set<String>visited=new HashSet<>(); //标记串是否已访问过
    Set<String>dict=new HashSet<>(wordList);//wordList中可能出现重复的串
    q.offer(beginWord);
    visited.add(beginWord);
    int len=1;
    while(!q.isEmpty()){
       int size=q.size(); //当前队列中字符串的个数
        for(int s=0;s<size;s++){
            String cur=q.poll();
            for(int i=0;i<cur.length();i++){ //对当前字符串的每一位进行改变
                for(char c='a';c<='z';c++){  //搜索的方式
                    char []curArray=cur.toCharArray();
                    char c1=curArray[i];
                    curArray[i]=c;
                    String temp=new String(curArray);
                    if(temp.equals(endWord)){ //到达endword
                        return len+1;
                    }
                    if(!visited.contains(temp)&&dict.contains(temp)){
                        visited.add(temp);
                        q.offer(temp);
                    }
                    curArray[i]=c1;//每次只能修改一个字母,所以为了进行下一个位置的搜索,需要还原当前位置的字符。
                }

            }
        }
        len++;   //每进行一次大的循环,长度加一。
    }
    return 0;
}
}

原文地址:https://www.cnblogs.com/yjxyy/p/11109861.html

时间: 2024-08-30 12:20:37

搜索(BFS)---最短单词路径的相关文章

【POJ3182】The Grove BFS 最短环绕路径

题意:给出一个N*M的图,其中'X'表示树木(树木一定聚集在一起成为森林,不会分开),然后'.'表示空地,'*'表示起点,现在要求从起点出发,绕森林一圈,最后回到起点,所经过最少点数. 题目中给的'+'就是其中一种最短路径. 题解:随便找一条经过森林且不经过起点的直线,可证路径一定会穿过这条直线,那么就在这条直线上枚举一个点,做两遍BFS,求其从分别直线两侧出发到起点的最短距离. 在这里说一个判断边界的简单方法,就是先给图里每个点打上标记,详见代码里'in'数组,in值为0的自然就不再里面,而没

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

广度/宽度优先搜索(BFS)详解

广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一个 广度/宽度优先搜索(BFS) 算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好. 2.图的概念 刚刚说的广度优先搜索是连通图的一种遍历策略,那就有必要将图先简单解释一下.

POJ 2329 (暴力+搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your pro

编程实现求一棵二叉树的最短树路径和最长树路径

Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. class Solution { public: int minDepth(TreeNode *root) { if(!r

AC日记——最长最短单词 openjudge 1.7 25

25:最长最短单词 总时间限制:  1000ms 内存限制:  65536kB 描述 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母.空格和逗号.单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔. 试输出第1个最长的单词和第1个最短单词. 输入 一行句子. 输出 两行输出:第1行,第一个最长的单词.第2行,第一个最短的单词. 样例输入 I am studying Programming language C in Peking University 样例输出 P

最长最短单词

21:最长最短单词    总时间限制:1000ms  内存限制:65536kB描述    输入1行句子(不多于200个单词,每个单词长度不超过100),    只包含字母.空格和逗号.单词由至少一个连续的字母构成,    空格和逗号都是单词间的间隔.    试输出第1个最长的单词和第1个最短单词.输入    一行句子.输出    两行输出:    第1行,第一个最长的单词.    第2行,第一个最短的单词.样例输入    I am studying Programming language C

统计语句中的最长最短单词

已知 string sentence="We were her pride of 10 she named us: Benjamin, Phoenix, the Pordigal and perspicacious pacific Suzanne.";编写程序,计算sentence中有多少个单次,并指出其中最长和最短的单词,如果有多个,则将它们全部输出 使用find_first_of 和find_first_not_of,寻找到单词的起始位置: 使用vector存放最长和最短单词:通过

最短Hamilton路径-状压dp解法

最短Hamilton路径 时间限制: 2 Sec  内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 第一行一个整数n. 接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(一个不超过10^7的正整数,记为a[i,j]). 对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a