[LeetCode][golang] 14. 最长公共前缀

876 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

  1. 最长公共前缀

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

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

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。   提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

思路分析:

可以先找到最短字符串,然后看看其它的字符串的前面有多少个和最短字符串中相同的字符。

  1. 循环数组获取最短字符串的长度

  2. 从0到最短字符串的长度循环

    1. 取第一个字符串的第 n 个字符
    2. 每个字符串的第 n 个文字是否与第一个字符串的第 n 个文字相同 相同则计数加1, 不相同则跳出所有循环
    3. 相同的文字添加到结果切片
  3. 结果切片中的文字连接成一个字符串,作为结果返回

AC 代码:

golang:

// 最长公共前缀
func longestCommonPrefix(strs []string) string {
   if len(strs) == 0 {
      return ""
   }

   // 获取最短字符串的长度
   minlen := 0
   for i, v := range strs {
      ln := len(v)
      if i == 0 {
         minlen = ln
      }
      if ln < minlen {
         minlen = ln
      }
   }

   var result []string
   // 不同标志
   isDiff := false
   // 从0到最短字符串的长度循环
   for m := 0; m < minlen; m++ {
      // 第一个字符串的第 m 个字符
      tmp := strings.Split(strs[0], "")[m]
      c := 0

      // 从第二个字符串循环
      for i := 1; i < len(strs); i++ {
         // 每个字符串的第 m 个文字是否与第一个字符串的第 m 个文字相同
         if strings.Split(strs[i], "")[m] == tmp {
            // 相同则计数加1
            c = c + 1
         } else {
            // 不相同则设置 不同标志 为 true 后,跳出内层循环
            isDiff = true
            break
         }
      }

      // 不同标志 为 true 时,跳出外层循环
      if isDiff {
         break
      }

      // 相同的文字添加到结果切片
      if c == len(strs)-1 {
         result = append(result, tmp)
      }
   }

   // 结果切片中的文字连接成一个字符串,返回
   return strings.Join(result, "")
}

总结:

  1. 感觉写得比较原始,不够高大上。
  2. golang 的 strings 库没有取指定下标字符的函数,我是先切成字符串数组,再取 下标 对应的值,回头再看看标准库里有没有。