文章目录
- 一、题目
 - 二、我的解法:双指针逐个字符比较
 - 三、巧妙解法:字符串的字典序比较
 - 四、知识点:字符串的字典序比较
 
一、题目

二、我的解法:双指针逐个字符比较
双指针逐个字符比较是最容易想到的方法,但由于测试用例中包含很多空字符串,导致经过出现下标越界的情况,因此我写了很多 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码更大
                


















