Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
- 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。 提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
思路分析:
可以先找到最短字符串,然后看看其它的字符串的前面有多少个和最短字符串中相同的字符。
-
循环数组获取最短字符串的长度
-
从0到最短字符串的长度循环
- 取第一个字符串的第 n 个字符
- 每个字符串的第 n 个文字是否与第一个字符串的第 n 个文字相同 相同则计数加1, 不相同则跳出所有循环
- 相同的文字添加到结果切片
-
结果切片中的文字连接成一个字符串,作为结果返回
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, "")
}
总结:
- 感觉写得比较原始,不够高大上。
- golang 的 strings 库没有取指定下标字符的函数,我是先切成字符串数组,再取 下标 对应的值,回头再看看标准库里有没有。