题目描述

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。

LeetCode原题地址:https://leetcode-cn.com/problems/longest-common-prefix/

测试用例

  • 示例 1

输入: [“flower”,“flow”,“flight”]
输出: “fl”

  • 示例 2

输入: [“dog”,“racecar”,“car”]
输出: “”

解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。

代码实现

  • 横向比较

字符串之间进行比较,求最长前缀公共子串,其实就是再求列表中所有字符串的前缀交集。所以,我们可以一个字符串一个字符串的比较。

第一个字符串与第二个字符进行比较求解最长前缀公共子串,得到的最长前缀公共子串再与下一个字符串进行比较,以此类推。如果在比较的过程中出现了最长前缀公共子串出现了空串就直接结束,因为空串与任何字符串的公共子串都为空。

class Solution:def lcp(self,s1,s2):"""计算两个字符串的最长公共自创:param s1::param s2::return:"""#最长公共子串的长度不会超过短的字符串s_len = min(len(s1),len(s2))index = 0while index < s_len:if s1[index] == s2[index]:index += 1else:breakreturn s1[:index]def longestCommonPrefix(self, strs: list) -> str:if len(strs) == 0:return ""#将列表第一个字符串赋值为最长公共子串com_prefix = strs[0]for s in strs[1:]:#计算最长公共子串与后面字符串的公共子串com_prefix = self.lcp(com_prefix,s)#如果最长公共子串为空,直接结束比较if len(com_prefix) == 0:return ""return com_prefixsolution = Solution()
print(solution.longestCommonPrefix(["dog","racecar","car"]))
  • 纵向比较

按列比较列表中每个字符串中的每个字符是否相等,如果下标超过字符串长度或比较的字符不相等就直接结束比较

class Solution:def longestCommonPrefix(self, strs) -> str:if len(strs) == 0:return ""#遍历第一个字符串for i in range(len(strs[0])):com_prefix_c = strs[0][i]#遍历后面的字符串for s in strs[1:]:#如果字符串的长度小于i或公共字符不相等#就直接结束比对if len(s) <= i or com_prefix_c != s[i]:return strs[0][:i]solution = Solution()
print(solution.longestCommonPrefix(["flower","flow","flight"]))
  • 递归法求解

将字符列表对半拆分,一级一级拆分下去来求解最长前缀公共子串

class Solution:def lcp(self,l,r):if l == r:return self._strs[l]m = (l+r) // 2l_s,r_s = self.lcp(l,m),self.lcp(m+1,r)min_len = min(len(l_s),len(r_s))for i in range(min_len):if l_s[i] != r_s[i]:return l_s[:i]return l_s[:min_len]def longestCommonPrefix(self, strs) -> str:self._strs = strsif len(strs) == 0:return ""return self.lcp(0,len(strs)-1)
  • 二分法

二分法的解题思路是,先计算出字符串列表中最小字符串的长度,然后再比较前一半的字符串是否相等,如果不相等,就比较前一半的一半,相等就比较前一半再增加后一半的一半,以此类推进行比较。

class Solution:def is_common_prefix(self,index):com_prefix = self._strs[0][:index]return all(s[:index]==com_prefix for s in self._strs[1:])def longestCommonPrefix(self, strs) -> str:self._strs = strsif len(strs) == 0:return ""min_s_len = min(len(s) for s in strs)low = 0high = min_s_len - 1while low < high:mid = low + (high-low+1) // 2if self.is_common_prefix(mid):low = midelse:high = mid - 1return strs[0][:low]solution = Solution()
print(solution.longestCommonPrefix(["flower","flow","flight"]))

参考:

  1. LeetCode解题思路

python求解最长前缀公共子串相关推荐

  1. cstring查找子字符串_动态规划6:两个字符串的最长连续公共子串

    本文和前一篇:动态规划5-两个字符串的最长公共子序列类似,但公共子串必须是连续的,子序列不需要连续 字符串a,长度为m:a[1].a[2].a[3].a[4]....a[m] 字符串b,长度为n:b[ ...

  2. C语言两个字符串查找最长的公共子串的算法(附完整源码)

    C语言两个字符串查找最长的公共子串的算法 C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测试) C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测 ...

  3. 求解最长单调递增子串

    求解最长递增子串可分为两种情况,即子串连续或非连续. 例如,对于整数串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4} 其连续递增子串为{2,4,6,7,8},非连 ...

  4. 求解最长回文子串----Manacher 算法

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字符串正着读和反着读是一样的,那么我们称之为回文串.例如:abba.aaaa.abvcba.123321等 暴力法:遍历字符串的所有 ...

  5. manacher介绍及图文讲解(用于求解最长回文子串)

    manacher算法是一种可以在O(N)时间复杂度下求字符串所有回文子串的算法,也是求最大回文子串最高效的算法.这种算法在进行遍历的时候,充分利用了回文串的特性,减少了许多不必要的计算,使得时间复杂度 ...

  6. 面试宝典_Python.常规算法.0002.输出任意两个字符串中最长公共子串?

    面试题目: 1. 用PY实现求任意两个字符串最长的公共子串? 解题思路: 1. 先求出长度最小的字符串,然后遍历其索引,这样可以避免字符串索引溢出,然后判断对应索引的值是否相同,相同的话就加到目标字典 ...

  7. 动态规划——最长公共子串,没有比这更通俗易懂的了

    前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...

  8. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  9. 助你深刻理解——最长公共子串、最长公共子序列(应该是全网数一数二的比较全面的总结了)

    往事不堪回首,那些年处理过的字符串[的一些骚操作] 最长公共子串篇(20191120) 理论知识: 图形理解: 矩阵初始化: 矩阵数值演变: 类似算法: 代码实现(C++): 代码设计满足的要求: 测 ...

最新文章

  1. 结构最清晰的Yolov3 head和loss实现完全解析
  2. phpstorm连接php文件夹,PHPstorm配置同步服务器文件
  3. vmware6.5实现基于win2003的群集
  4. Python学习笔记:Day 16 编写移动App
  5. Linux C语言 文件操作
  6. Java笔记-concurrent集合及线程池
  7. ticwatch能支持鸿蒙吗,[杰瑞]安卓手表的最强形态,应该... - @魔法师蛋小丁 的微博精选 - 微博国际站...
  8. 大数据时代:数据质量逐渐成关注焦点
  9. Android-Parcelable理解与使用(对象序列化)
  10. java white case语句_MySQL的CASEWHEN语句使用说明_MySQL
  11. 使用Python爬虫爬取淘宝商品并分析
  12. Codeforces Round #660 (Div. 2) B. Captain Flint and a Long Voyage
  13. int类型和Integer类型数据的比较
  14. 中国天气网天气api接口 天气预报调用方法 2020
  15. 【threejs】可视化大屏酷炫3D地图附源码
  16. 【SLAM学习笔记】6-ORB_SLAM3关键源码分析④ Optimizer(一)单帧优化
  17. seo排名检测软件-免费SEO排名监管检测工具-自动检测网站排名
  18. MongoRepository 基本使用
  19. 力科示波器 matlab,力科示波器手册.pdf
  20. ExoPlayer浅析

热门文章

  1. 360浏览器的主页为什么无法修改?
  2. Cocos2d-x Touch事件处理
  3. 2022-2027年(新版)中国抽油烟机行业经营状况及营销对策研究报告
  4. [深入理解Android卷一全文-第五章]深入理解常见类
  5. 2021年安全员-C证最新解析及安全员-C证模拟考试
  6. 每日一词20190315——元数据(Metadata)
  7. 抖音seo源码,抖音矩阵,seo系统,抖音搜索排名。
  8. JAVA消息(第二篇)AMQP-RabbitMQ实战!!!不打哈哈!!!包教包会!!不闹!!
  9. C++课程设计之排考场座位系统设计
  10. 待解之谜——陨石带来了什么