zoukankan      html  css  js  c++  java
  • 最长公共前缀的golang实现

    编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 ""。

    输入: ["flower","flow","flight"]
    输出: "fl"
    输入: ["dog","racecar","car"]
    输出: ""
    解释: 输入不存在公共前缀。

    首先理解题意:

    • 当源字符串数组中一个元素也没有,那肯定是返回空字符串了
          slen := len(strs)
          //特殊情况,当切片中没有任何元素的时候返回""
          if slen==0{
              return ""
          }
    • 而最坏的情况就是得到源数组中长度最小的字符串,那我们就要找到最小长度的字符串了
        //找出最小长度的字符串、字符串长度以及索引
        minLen := math.MaxInt32
        minIndex := 0
        minLenStr := ""
        for i := 0; i < slen; i++ {
            if len(strs[i]) < minLen {
                minLen = len(strs[i])
                minIndex = i
                minLenStr = strs[i]
            }
        }
    • 然后我们就可以对源字符串中的每一个元素与最小长度的那个字符串比较了,但是考虑到空间和时间的问题,我们可以先把源字符串中的那个最小长度的字符串去掉,然后再进行比较
          //先对上面得到的最小长度的字符串进行for循环,得到每一个字符
          //然后对源切片strs剩下的元素进行for循环,得到strs中每个元素的第一位字符,与最小长度得到的字符相比
          //最后把相同的字符加到返回值中去
          for _, c := range minLenStr {
              for z := 0; z < len(strs); z++ {
                  if string(c) == string(strs[z][0]) {
                      strs[z] = strs[z][1:]
                  } else {
                      return result
                  }
              }
              result += string(c)
          }
          return result

      这里有个小技巧,就是每次只比对源字符串数组剩下的元素的第一位,如果是与最小字符串对应位置的一样,那我们就把源字符串数组对应的元素去除掉第一个字符

      整体代码:
      func longestCommonPrefix(strs []string) string {
          result := ""
          slen := len(strs)
          //特殊情况,当切片中没有任何元素的时候返回""
          if slen==0{
              return ""
          }
      
          //找出最小长度的字符串、字符串长度以及索引
          minLen := math.MaxInt32
          minIndex := 0
          minLenStr := ""
          for i := 0; i < slen; i++ {
              if len(strs[i]) < minLen {
                  minLen = len(strs[i])
                  minIndex = i
                  minLenStr = strs[i]
              }
          }
      
          //在strs去除掉长度最小的字符串
          strs = append(strs[:minIndex], strs[minIndex+1:]...)
      
          //先对上面得到的最小长度的字符串进行for循环,得到每一个字符
          //然后对源切片strs剩下的元素进行for循环,得到strs中每个元素的第一位字符,与最小长度得到的字符相比
          //最后把相同的字符加到返回值中去
          for _, c := range minLenStr {
              for z := 0; z < len(strs); z++ {
                  if string(c) == string(strs[z][0]) {
                      strs[z] = strs[z][1:]
                  } else {
                      return result
                  }
              }
              result += string(c)
          }
          return result
      }

      当然我们也有另外一种思考方式,那就是比较不一样的,当不一样,那我们就返回源切片的对应元素的对应索引,不然就直接返回最小长度的字符串

          for i, c := range minLenStr {
              for z := 0; z < len(strs); z++ {
                  if strs[z][i] != byte(c) {
                      return strs[z][:i]
                  }
              }
          }
          return minLenStr
  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/TimLiuDream/p/9975495.html
Copyright © 2011-2022 走看看