(未完)超详细讲解:leetcode-0014-LongestCommonPrefix(最长公共前缀)

1. 题目地址

2. 题目描述

  • 英文描述
Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".


Example 1:

Input: strs = ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: strs = ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.
 

Constraints:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] consists of only lower-case English letters.

  • 中文描述
编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

 
示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
 

提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

3. 解题思路

  • 第一种:横向比较:首先想到的就是用横向比较的方法来解决。
    • 思想:
      • 题目是要求找最长公共前缀,也就是字符串数组中每个字符串所共有的最长公共前缀。
      • 最先想到的就是:两两比较,找出这两个之间的最长公共前缀,再拿这个当前的最长公共前缀去和第三个字符串比较找到最长公共前缀,更新这个最长公共前缀,直到所有的都比较完确定出最终的最长公共前缀。
      • 遍历结束的条件是:当前的最长公共前缀为空串 或者 遍历到数组结束。(因为当前最长公共前缀已经是空串的话,就不需要往后遍历了,说明这个字符串数组不存在最长公共前缀)
    • 时间复杂度:O(mn),其中:m是字符串数组中字符串的平均长度,n是字符串数组中字符串的个数即字符串数组的长度。
    • 空间复杂度:O(1)
  • 第二种:纵向比较法
    • 思想:假设字符串数组的长度为n,纵向比较法可以理解为:拿n个指针指向这些字符串的同一列,同时进行比较,往后遍历,直到指针所指位置的值出现不相等的情况。那么,这一列之前的部分就是最长公共前缀。
    • 分析:
    • 时间复杂度:
    • 空间复杂度:

4. 解题关键

  • 要想到栈的结构
    • 时间复杂度:
    • 空间复杂度:
  • 也可用正则匹配的方式
    • 时间复杂度:
    • 空间复杂度:

5. 示例代码

横向比较法:
python代码

class Solution:
    def findPrefix(self, str1, str2):
        minlen = min(len(str1), len(str2))
        index = 0
        while index < minlen and str1[index] == str2[index]:
            index += 1
        prefixList = str1[:index]

        return prefixList


    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""
        else:
            count = len(strs)
            prefixList = strs[0]

            for i in range(1, count):
                if prefixList:
                    prefixList = self.findPrefix(prefixList, strs[i])
                else:
                    break
            return prefixList
	

6. 相关题目1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值