• 【leetcode】127. Word Ladder


    题目大意:

    给一个开始单词beginword和一个结束单词endword, 再给一个单词列表wordList。从beginword变换到endword, 每次只能变换一个字母,且变换成的词属于wordList。

    解决思路:

    其实是个变相的BFS,寻找当前集合中相邻的可以进行变换的单词,更新当前集合,直到集合中出现endword。

    另,一开始用DFS,递归解法,结果TLE。

    超时解法:

    var isExist  =  false
    var minLen   = 0
    var target   = ""
    func ladderLength(beginWord string, endWord string, wordList []string) int {
        minLen = len(wordList)
        target = endWord
        bfs(1, beginWord, wordList)
        if isExist == false {
            minLen = 0
        }
    
        return  minLen
    }
    
    func bfs(curLen int, curStr string, remainList []string) {
        for i, remainStr := range remainList {
            diffNum := 0
            for j, curCh := range curStr {
                if byte(curCh) != byte(remainStr[j]) {
                    diffNum++
                }
    
                if diffNum > 1 {
                    break
                }
            }
    
            if target == curStr {
                isExist = true
                if minLen > curLen {
                    minLen = curLen
                    return
                }
            }
    
            if diffNum == 1 {
                bfs(curLen + 1, remainStr, append(remainList[:i], remainList[i+1:]...))
            }
        }
    }
    View Code

    BFS:

    func ladderLength(beginWord string, endWord string, wordList []string) int {
        
        var candiList = []string{beginWord}
        var minLen    = 1
        for len(candiList) > 0 {
            var tempList []string
            for _, candWord := range candiList {
                if candWord == endWord {
                    return minLen
                }
    
                for i, word := range wordList {
                    if word == candWord {
                        wordList = append(wordList[:i], wordList[i+1:]...)
                        break
                    }
                }
    
                for _, word := range wordList {
                    diffNum := 0
                    for j, ch := range candWord {
                        if byte(ch) != byte(word[j]) {
                            diffNum++
                        }
                        if diffNum > 1 {
                            break
                        }
                    }
                    if diffNum == 1 {
                        tempList = append(tempList, word)
                    }
                }
    
            }
            candiList = tempList
            minLen++
        }
    
        return  0
    }
  • 相关阅读:
    字符串函数---atof()函数具体解释及实现(完整版)
    curl的简单使用
    [7] 算法之路
    springMVC3.0(文件上传,@RequestMapping加參数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传參,ajax,拦截器)
    hdu 1754 I Hate It 线段树 点改动
    经典的7种排序算法 原理C++实现
    自己定义View实现水平滚动控件
    centos编译ffmpeg x264
    工作脚本处理文本
    A*寻路算法
  • 原文地址:https://www.cnblogs.com/AndrewGhost/p/11878335.html
Copyright © 2020-2023  润新知