【算法训练】LeetCode#14 最长公共前缀
一、描述
最长公共前缀
难度:简单
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
二、问题
不知道理解的对不对,这道题是最长公共前缀,按照我的理解,只要是发现有一处不相等的字符,就直接返回判断完成的结果。
基于这个理解,写了下面的代码,但是没想到测试用例中存在空测试用例...直接越界了
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
result = ""
char = ''
shortLen = len(strs[0])
for i in range(len(strs)):
# 获取所有字符串中最短长度
if shortLen > len(strs[i]):
shortLen = len(strs[i])
loc = 0
char = strs[0][0] # 存储第一个字符串的第一个字符
for i in range(shortLen):
# 遍历所有字符串
for j in range(len(strs)):
if strs[j][loc] != char:
# 如果出现不等字符,则后续不会有公共前缀,直接return即可
return result
result += char
loc += 1
char = strs[0][loc]
return result
虽然改掉了空测试用例...但是还有一种测试用例没有想到:["",""]
应该在获取最短长度后优先判断最短长度是不是0,否则strs[0][0]
可能导致越界
result = ""
if len(strs) == 0:
return result
char = ''
shortLen = len(strs[0])
for i in range(len(strs)):
# 获取所有字符串中最短长度
if shortLen > len(strs[i]):
shortLen = len(strs[i])
loc = 0
char = strs[0][0] # 存储第一个字符串的第一个字符
for i in range(shortLen):
# 遍历所有字符串
for j in range(len(strs)):
if strs[j][loc] != char:
# 如果出现不等字符,则后续不会有公共前缀,直接return即可
return result
result += char
loc += 1
char = strs[0][loc]
return result
坑有点多...在给char赋值时,应该在进循环处,而不是if下,不然也有可能导致越界
result = ""
if len(strs) == 0:
# 如果数据为空直接返回结果
return result
if len(strs) == 1:
# 如果只有一个字符串则公共前缀就为它本身
return strs[0]
char = ''
shortLen = len(strs[0])
for i in range(len(strs)):
# 获取所有字符串中最短长度
if shortLen > len(strs[i]):
shortLen = len(strs[i])
if shortLen == 0:
return result
loc = 0
for i in range(shortLen):
# 遍历所有字符串
char = strs[0][loc] # 存储第一个字符串的第loc个字符
for j in range(len(strs)):
if strs[j][loc] != char:
# 如果出现不等字符,则后续不会有公共前缀,直接return即可
return result
result += char
loc += 1
return result
三、解题(2020.09.23)
这道题算是最近几道题中坑比较多的了~
result = ""
if len(strs) == 0:
# 如果数据为空直接返回结果
return result
if len(strs) == 1:
# 如果只有一个字符串则公共前缀就为它本身
return strs[0]
char = ''
shortLen = len(strs[0])
for i in range(len(strs)):
# 获取所有字符串中最短长度
if shortLen > len(strs[i]):
shortLen = len(strs[i])
if shortLen == 0:
return result
loc = 0
for i in range(shortLen):
# 遍历所有字符串
char = strs[0][loc] # 存储第一个字符串的第loc个字符
for j in range(len(strs)):
if strs[j][loc] != char:
# 如果出现不等字符,则后续不会有公共前缀,直接return即可
return result
result += char
loc += 1
return result