最长公共前缀

问题描述

LeetCode14. 最长公共前缀

给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。

示例:

输入:["abca","abc","abca","abc","abcc"]

输出:"abc"

分析问题

对于求一组字符串的公共前缀,我们可以先求出前两个字符串的公共前缀,然后拿该公共前缀再和第三个字符串求公共前缀,依次类推,知道遍历完所有字符串,即可得到该组字符串中的最长公共前缀。

alt

更多图解高频算法,请关注公众号【程序员学长】,100多道高频算法题尽在这里,欢迎大家

我们来看一下代码的实现。

class Solution:
    def longestCommonPrefix(self, strs):
        #如果字符数组为空,则最长公共前缀为空,直接返回
        if not strs:
            return ""

        #首先令最长公共前缀max_prefix为字符数组strs的第一个字符串
        max_prefix=strs[0]
        n=len(strs)
        #依次和字符数组中的其它元素求最长公共前缀
        for i in range(1, n):
            max_prefix = self.lcp(max_prefix, strs[i])
            #如果遇到max_prefix为空,直接返回
            #因为空字符串和任意其它字符串的公共前缀都为空
            if not max_prefix:
                break

        return max_prefix

    def lcp(self, str1, str2):
        length, index = min(len(str1), len(str2)), 0
        #循环遍历,寻找最长公共前缀
        while index < length and str1[index] == str2[index]:
            index += 1
        return str1[:index]

除了横向遍历字符串数组外,即依次遍历数组中的每个字符串,然后更新最长公共前缀。我们还可以进行纵向遍历,即我们通过比较字符串数组中的每一列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则表示当前列已经不再属于公共前缀了,直接返回当前列之前的部分就是最长公共前缀。

alt

更多图解高频算法,请关注公众号【程序员学长】,100多道高频算法题尽在这里,欢迎大家

下面我们来看一下代码的实现。

class Solution:
    def longestCommonPrefix(self, strs):
        #如果字符数字为空,则最长公共前缀为空
        if not strs:
            return ""

        length=len(strs[0])
        n=len(strs)
        
        #比较所有字符串的每一列是否相同
        for i in range(length):
            c = strs[0][i]
            for j in range(1,n):
                if i>=len(strs[j]) or strs[j][i] != c:
                   return strs[0][:i]
                
        return strs[0]