题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
方案一
class Solution:
def longestCommonPrefix(self, strs: [str]) -> str:
'''为了性能考虑,采用空间换时间的算法:
方案一
1. 循环一次输入数组,构建出所有的前缀子串
2. 从前缀子串中找出相同的子串
方案二
1. 数组中不放所有前缀子串,放的是相同的前n个字符
下述采用方案一
'''
if not strs:
return ""
substrs = self.getSubStrs(strs[0]) # 后面的公共子串比前面的长
for i in range(1, len(strs)):
substrs = self.getMaxPrefix(substrs, strs[i])
return substrs[-1]
def getSubStrs(self, s):
if not s:
return [""]
substrs = []
for i in range(len(s) + 1):
substrs.append(s[:i])
return substrs
def getMaxPrefix(self, substrs, s):
'''从已有的前缀子串数组中匹配最长的子串并返回匹配后的子串数组
'''
for i in range(len(substrs) - 1, 0, -1):
if s.startswith(substrs[i]):
return substrs[:i + 1]
return [""]
方案二
func longestCommonPrefix(strs []string) string {
if len(strs) == 0 {
return ""
}
// 将数组中第一个元素拆分成字符数组
prefixes := strings.Split(strs[0], "")
// 循环后面的元素
for _, str := range strs[1:] {
if len(prefixes) > len(str) { // 前缀切片长度大于当前 str
prefixes = prefixes[:len(str)]
}
for i, c := range prefixes {
if c != string(str[i]) {
prefixes = prefixes[:i]
break
}
}
}
return strings.Join(prefixes, "")
}
- 认为数组中第一个元素就是前缀子串;
- 循环数组中每一个字符串,如果获取最小公共子串。
- 时间复杂度
原文
https://leetcode-cn.com/explore/featured/card/array-and-string/200/introduction-to-string/781/