Go语言:基础练习–查找字符串数组中的最长公共前缀
题目大意:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “"。
下文给出两种解法,一种是本人按照思路直接表达的写法,另一种是其他网友的写法,供对比学习。
写法一:
import "fmt"
func getLongestPrefix(words []string) string{
// 根据从短到长的顺序重新排列单词
for i := 0; i < len(words); i++ {
for j := i + 1; j < len(words); j++ {
if len(words[i]) > len(words[j]) {
words[i], words[j] = words[j], words[i]
}
}
}
//fmt.Println(words)
prefix := ""
flag := true
// 遍历最短的单词与其他单词对比,相同则继续比较,出现不同直接退出比较
for l := 0; l < len(words[0]); l++ {
for k := 1; k < len(words); k++ {
if words[0][l] != words[k][l] {// 一旦出现有一个单词的字母不一致,就不用再比较了
flag = false
break
}
}
if flag {
prefix += string(words[0][l])
} else {
break
}
}
return prefix
}
func main() {
words := []string{"flower","flow","flight"}
fmt.Println(getLongestPrefix(words))
}
写法二:
func longestCommonPrefix(strs []string) string {
prefix := strs[0]
for i := 1; i < len(strs); i++ {
for j := 0; j < len(prefix); j++ {
if len(strs[i]) <= j || strs[i][j] != prefix[j] { // 随着j的增加,单词的长度小于第一个单词时,这时说明这个短单词跟长单词的前部分完全一致,退出循环,否则已经触发后面一个条件了,对比有字母不同即退出循环,前缀为到这个字母前一个位置的切片;随着其他的单词的逐步对比,会不断更新prefix,最后返回结果。这个方法的好处是不用单独对单词长度排序,直接对比得到最长相同前缀。
prefix = prefix[0:j]
break
}
}
}
return prefix
}