【算法训练】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
posted @ 2022-01-18 17:41  小拳头呀  阅读(7)  评论(0编辑  收藏  举报