最长公共前缀
https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnmav1/
https://leetcode-cn.com/problems/longest-common-prefix/solution/
横向扫描
遍历所有字符串,计算并更新公共前缀。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | func longestCommonPrefix(strs []string) (prefix string) {     prefix = strs[0]     for _, str := range strs {         prefix = LCP(prefix, str)         if prefix == "" {             return          }     }     return }
  func LCP(str1 string, str2 string) string {     index := 0          for index < len(str1) && index < len(str2) && str1[index] == str2[index] {         index++     }
      return str1[:index] }
 
  | 
 
纵向扫描
遍历字符串相同位置的字母,例如对于 flow flower florance,取第一个 flow 作为基准,先检查 f,然后检查fl,然后检查 flo。
以此类推,直到某个单词读完了或者有不通过检查的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | func longestCommonPrefix(strs []string) string {     var sb strings.Builder     flag := true
      for i, r := range strs[0] {         for _, rs := range strs {             if i >= len(rs) || r != rune(rs[i]) {                 flag = false                 break             }         }         if flag {            sb.WriteRune(r)         }     }
      return sb.String() }
 
  | 
 
我的解法:用 strings.Builder 来拼接字符串,其实没有必要,对于这种不需要重新组装字符串的情况,直接用切片就行了。
1 2 3 4 5 6 7 8 9 10
   | func longestCommonPrefix(strs []string) (prefix string) {     for i := 0; i < len(strs[0]); i++ {         for j := 1; j < len(strs); j++ {             if i == len(strs[j]) || strs[j][i] != strs[0][i] {                 return strs[0][:i]             }         }     }     return strs[0] }
 
  |