14.最长公共前缀

解题思路:

  1. 初始化: 将第一个字符串假设为公共前缀。
  2. 遍历其他字符串: 依次检查每个字符串是否具有相同的前缀。如果发现一个字符串在某个位置的字符与公共前缀不同或公共前缀的长度超过该字符串的长度,则截断公共前缀到该位置的字符。
  3. 返回结果: 在所有字符串都比较完之后,剩下的公共前缀就是答案。
func longestCommonPrefix(strs []string) string {
      if len(strs) == 0 {
          return ""
      }
      prefix := getMinLenEle(strs)
  
      var ans []byte
      for i := range prefix {
          for _, s := range strs[1:] {
              if s[i] != prefix[i] {
                  return string(ans)
              }
          }
          ans = append(ans, prefix[i])
      }
      return string(ans)
  }
  
  func getMinLenEle(strs []string) string {
      n := len(strs[0])
      var result string
      for _, str := range strs[1:] {
          if len(str) < n {
              result = str
          }
      }
      return result
}

解题思路:

  1. 初始公共前缀: 假定第一个字符串为公共前缀。
  2. 逐字符串更新公共前缀: 对数组中的每个字符串,逐字符比较,如果发现不匹配或者当前字符串长度小于公共前缀长度,就缩短公共前缀。
  3. 检查早期退出条件: 如果公共前缀在比较过程中变为空,直接返回空字符串,表示没有公共前缀。
  4. 最终返回: 如果所有字符串都检查完,返回最终的公共前缀。
func longestCommonPrefix(strs []string) string {
      if len(strs) == 0 {
          return ""
      }
      
      // 将第一个字符串设为初始的公共前缀
      prefix := strs[0]
      
      for _, str := range strs[1:] {
          // 逐字符比较当前字符串和公共前缀
          for len(str) < len(prefix) || (len(prefix) > 0 && str[:len(prefix)] != prefix) {
              prefix = prefix[:len(prefix)-1]
          }
          
          // 如果公共前缀变为空,直接返回
          if prefix == "" {
              return ""
          }
      }
      
      return prefix
}