文章目录
- 一、题目
- 二、我的解法:双指针逐个字符比较
- 三、巧妙解法:字符串的字典序比较
- 四、知识点:字符串的字典序比较
一、题目
二、我的解法:双指针逐个字符比较
双指针逐个字符比较是最容易想到的方法,但由于测试用例中包含很多空字符串,导致经过出现下标越界的情况,因此我写了很多 if-else 来判断字符串是否为空已经是否越界,导致代码非常冗余,并且非常不便于理解。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
length=len(strs)
if length==1:
return strs[0]
ans=""
for j in range(0,sys.maxsize):
label=0
temp=""
# 防止 strs[0] 为空或 strs[0] 下标越界
if len(strs[0])!=0 and len(strs[0])>len(ans):
temp=strs[0][j]
else:
return ans
for i in range(1,length):
# 防止 strs 中的数组均为空字符串,如 strs = ["","",""]
if len(strs[i])!=0:
if len(strs[i])<=len(ans):
return ans
elif strs[i][j]==temp:
label+=1
if label==length-1:
ans+=temp
else:
break
return ans
三、巧妙解法:字符串的字典序比较
由于题目中说 strs[i] 仅由小写英文字母组成,那么就可以根据 字符串的字典序比较来找到 ascii码 最小和最大的字符串,只需要找到最小和最大的字符串的最长公共前缀即可。
注意:是找到 ascii码 最小和最大的字符串,而不是最短和最长的字符串。找最短和最长的字符串时候错误的,如:
输入:["flower","flow","flight"]
输出:"flow"
正确答案:"fl"
code 3:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
minStr=min(strs)
maxStr=max(strs)
minLen=len(minStr)
ans=""
for i in range(minLen):
if minStr[i]==maxStr[i]:
ans+=minStr[i]
else:
break
return ans
四、知识点:字符串的字典序比较
code 3 中的 min(strs) 和 max(strs) 是查找 ascii码 最小和最大的字符串,可以通过代码验证一下:
strs = ["ab", "abc", "d"]
print(min(strs)) # ab
print(max(strs)) # d
字符串直接比大小比的是逐个元素的 ascii码 的大小,而不是比较字符串长度:
print("abc" > "b") # False,因为 "b" 的 ascii码比 "abc" 的首元素 "a" 的 ascii码更大