美文网首页
Go 关于串的三个经典案例

Go 关于串的三个经典案例

作者: Yohann丶blog | 来源:发表于2020-06-12 09:53 被阅读0次
WechatIMG36.jpeg

子串查找

  • 介绍

子串查找,也可以成为字符串查找。其中有两个字符串,分为主串和子串(模式串)。在主串中查找是否含有子串,且顺序长度相等。

  • 创建 strstr.go 内容如下:
package main

import (
    "fmt"
)

func main() {
    var mainString,subString = "mongodb","go"
    var result = false
    for i := 0; i < len(mainString)-len(subString)+1; i++ {
        if mainString[i] == subString[0] {
            var end = 0
            for j := 0; j < len(subString); j++ {
                end = j
                if mainString[i+j] != subString[j] {
                    break
                }
            }
            if end == len(subString)-1 {
                result = true
            }
        }
    }
    fmt.Println(result)
}
  • 执行
$ go run strstr.go
true

最大公共子串

  • 介绍

最大公共子串,即存在两个字符串中,交集长度最多的一串字符,且顺序长度相等。

  • 创建 maxSubStr.go 内容如下:
package main

import (
    "fmt"
)

func main() {
    var str1,str2,maxSubStr = "ElasticSearch","ElasticHD",""
    var maxlen,m,n,str1len,str2len = 0,0,0,0,0
    for i := 0; i < len(str1); i++ {
        for j := 0; j < len(str2); j++ {
            if str1[i] == str2[j] {
                m,n = i,j
                str1len,str2len = len(str1),len(str2)
                for ; m<str1len && n<str2len; m,n = m+1,n+1 {
                    if str1[m] != str2[n] {
                        break
                    }
                    if maxlen < m-i {
                        maxlen = m-i
                        maxSubStr = str1[i:m+1]
                    }
                }
            }
        }
    }
    fmt.Println(maxSubStr)
}

上述代码用了三层 for 循环,因此时间复杂度为 O(n)^3。

  • 使用动态规划方法优化如下。
package main

import (
    "fmt"
)

func main() {
    var str1,str2 = "ElasticSearch","ElasticHD"
    m := make([][]int, len(str2)+1) 
        for n := range m{ m[n] = make([]int, len(str1)+1) }

    for i := 1; i <= len(str2); i++ {
        for j := 1; j <= len(str1); j++ {
            if str2[i-1] == str1[j-1] {
                m[i][j] = m[i-1][j-1] + 1
            }
        }
    }

    max := 0
    index := 0;
    for x := 0; x < len(str2); x++ {
        for y := 0; y < len(str1); y++ {
            if m[x][y] > max {
                max = m[x][y]
                index = x
            }
        }
    }
    
    maxSubStr := ""
    for i := index-max; i < index; i++ {
        maxSubStr += string(str2[i])
    }
    fmt.Println(maxSubStr)
}
  • 执行
$ go run maxSubStr.go
Elastic

翻转单词

  • 介绍

翻转单词,把一段英文单词构成的字符串的顺序逆转。

  • 创建 reverseWord.go 内容如下:
package main

import (
    "fmt"
    "strings"
)

func main() {
    var str = "she and he"
    arr := strings.Split(str, " ")
    var reverseArr = make([]string, len(arr))
    m := len(arr)-1
    n := 0
    for ; m >= 0; m,n = m-1,n+1 {
        reverseArr[n] = arr[m]
    }
    reverseWord := strings.Join(reverseArr, " ")
    fmt.Println(reverseWord)
}
  • 执行
$ go run reverseWord.go
he and she

相关文章

网友评论

      本文标题:Go 关于串的三个经典案例

      本文链接:https://www.haomeiwen.com/subject/cjfgtktx.html