📅  最后修改于: 2023-12-03 14:55:22.864000             🧑  作者: Mango
在软件开发中,经常需要比较多个字符串的相同前缀,以此来优化算法效率或提供更好的用户体验。最长公共前缀(Longest Common Prefix,简写为LCP)是指多个字符串中,最长的共同前缀。本文将介绍如何使用常规算法、Trie树和二分查找法来解决最长公共前缀问题。
常规算法是最朴素的方法,即先选取一个字符串作为基准,然后与后面的所有字符串逐一比较,取出最长的公共前缀。具体步骤如下:
时间复杂度:O(mn),其中n是字符串的数量,m是字符串的最大长度。
代码实现:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""
prefix = strs[0]
for i in range(1, len(strs)):
while strs[i].find(prefix) != 0:
prefix = prefix[:-1]
if not prefix:
return ""
return prefix
Trie树是一颗多叉树,用于实现字符串的存储和快速查询。它的特点是,字符串的每个字符都对应一颗子树,从根节点到叶节点的路径表示一个字符串。利用Trie树,可以在O(mlogn)的时间复杂度内解决最长公共前缀问题,其中m是字符串的平均长度,n是字符串的数量。
具体步骤如下:
时间复杂度:O(mlogn)。
代码实现:
class Trie:
def __init__(self):
self.root = {}
def insert(self, word):
cur = self.root
for c in word:
if c not in cur:
cur[c] = {}
cur = cur[c]
cur['#'] = True
def longestCommonPrefix(self):
prefix = ''
cur = self.root
while len(cur) == 1 and '#' not in cur:
c = list(cur.keys())[0]
prefix += c
cur = cur[c]
return prefix
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""
trie = Trie()
for s in strs:
trie.insert(s)
return trie.longestCommonPrefix()
二分查找是一种高效的查找算法,它可以在O(logn)的时间复杂度内查找到一个元素。利用二分查找法,可以在O(mnlogn)的时间复杂度内解决最长公共前缀问题,其中m是字符串的平均长度,n是字符串的数量。
具体步骤如下:
时间复杂度:O(mnlogn)。
代码实现:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""
minLen = min([len(s) for s in strs])
left, right = 0, minLen
while left < right:
mid = (left + right + 1) // 2
prefix = strs[0][:mid]
if all([s.startswith(prefix) for s in strs]):
left = mid
else:
right = mid - 1
return strs[0][:left]
本文介绍了如何使用常规算法、Trie树和二分查找法来解决最长公共前缀问题。常规算法是最朴素的方法,时间复杂度为O(mn);Trie树是一种高效的数据结构,时间复杂度为O(mlogn);二分查找法是一种高效的查找算法,时间复杂度为O(mnlogn)。选择何种方法,需要根据具体情况灵活运用。