zoukankan      html  css  js  c++  java
  • Word Ladder(找出start——end的最短长度)——bfs

    Word Ladder

    Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, 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"]

    As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
    return its length 5.

    Note:

      • Return 0 if there is no such transformation sequence.
      • All words have the same length.
      • All words contain only lowercase alphabetic characters.

    最短搜索路径,所以是广度优先搜索(BFS)。

    有几个问题需要注意:

    1、怎样判断是否为邻居节点?

    按照定义,存在一个字母差异的单词为邻居,因此采用逐位替换字母并查找字典的方法寻找邻居。

    (逐个比对字典里单词也可以做,但是在这题的情况下,时间复杂度会变高,容易TLE)

    2、怎样记录路径长度?

    对队列中的每个单词记录路径长度。从start进入队列记作1.

    长度为i的字母的邻居,如果没有访问过,则路径长度为i+1

     1 class Solution {
     2 public:
     3     int ladderLength(string start, string end, unordered_set<string> &dict) {
     4         if(match(start,end))
     5             return 2;
     6         queue<string> q;
     7         map<string,int> m;
     8         q.push(start);
     9         m[start]=1;
    10         while(!q.empty()){
    11             string tmp=q.front();
    12             q.pop();
    13             for(int i=0;i<tmp.length();i++){
    14                 for(char c='a';c<='z';c++){
    15                     if(c==tmp[i])
    16                         continue;
    17                     string next=tmp;
    18                     next[i]=c;
    19                     if(next==end){
    20                         return m[tmp]+1;
    21                     }
    22                     if(dict.find(next)!=dict.end()&&m.find(next)==m.end()){
    23                         q.push(next);
    24                         m[next]=m[tmp]+1;
    25                     }
    26                 }
    27             }
    28         }
    29         return 0;
    30     }
    31     bool match(string src,string dst){
    32         if(src.length()!=dst.length()){
    33             return false;
    34         }
    35         int count=0;
    36         for(int i=0;i<src.length();i++){
    37             if(src[i]!=dst[i])
    38                 count++;
    39         }
    40         return count==1?true:false;
    41     }
    42 };
  • 相关阅读:
    SQLi-Labs
    ASP.NET 简介
    CSS
    Apache 基本配置
    【Windows 基础】 01
    sqli1-4
    SQL注入介绍(本文更新中)
    【DC-1】靶机实战
    常见端口的漏洞总结
    element ui table动态控制某列展示与否,并且该列使用了fixed,导致列表错位问题
  • 原文地址:https://www.cnblogs.com/zl1991/p/6995806.html
Copyright © 2011-2022 走看看