Python中最长公共前缀

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

示例

1:输入: [“flower”,“flow”,“flight”]输出: "fl"示例
2:输入: [“dog”,“racecar”,“car”]输出: ""解释: 输入不存在公共前缀。

思路1:
可循环遍历列表中每个字符串,判断字符串相同的位置的字母是否相等,如果相等则记录字母并判断下一个字母,否则就返回记录的字符串。

mls1 = ["flower","flow","flight"]
mls1 = ["dog","racecar","car"]

def mfun(mls1):
    mls2 = []		# 用来记录相同的字母

    if len(mls1) == 0:
        return ''	# 如果列表为空,直接返回

    num = 0
    for k in mls1:		# 循环字符串,找到最短的长度,作为最长公共子串的最长长度
        if len(k) > num:
            num = len(k)

    for i in range(num):	# i 为下标值
        for j in mls1:		# 将列表中每个字符串的第 i 个字母添加到列表中
            mls2.append(j[i])
        if (len(set(mls2))) == 1:	# 对列表进行集合操作,如果集合后长度为1 则
            						# 这几个字母相同,继续判断下一个字母
            mls2.clear()
        else:			# 如果长度不为1, 最长公共子串已经找到,
            # print(i)
            if j[0:i:1]:	# 切片操作找到 最长公共子串
                return (j[0:i:1])
            else:
                return ""
print(mfun(mls1))

思路2:
可以运用Python 中的内置函数zip ,方便的判断最长公共子串。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def mfun2(strs):
    ans = ''	# 定义空字符串,准备用来存放最长公共子串
    for i in zip(*strs):	# *strs 将列表解包成几个字符串元素
        if len(set(i)) == 1:	# 判断zip后的元素的集合的长度,如果=1,
            					# 说明几个字母相等,追加到最长公共子串中
            ans += i[0]
        else:					# 否则就是不相等。
            break
    return ans

zip函数解析:

zip(iterable, iterable, ...)
# zip的参数是多个迭代器, 返回值为 几个元组作为元素的列表。
# zip 类似于矩阵操作: 例如:
zip('123', '456', '789')

操作过程:
		1  2  3 
    	4  5  6
        7  8  9
 ====>   将行变成列,将列变成行,组成列表返回
		1  4  7
    	2  5  8
        3  6  9
 ====> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]


for i in zip('123', '456', '789'):
    print(i)
    
('1', '4', '7')
('2', '5', '8')
('3', '6', '9')


>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者

Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者

Python可以使用动态规划算法来解决最长公共子序列(Longest Common Subsequence,简称LCS)问题。LCS问题是指在两个序列找到一个最长公共子序列。 以下是解决LCS问题的Python代码示例: ```python def longest_common_subsequence(str1, str2): m = len(str1) n = len(str2) # 创建一个二维数组来保存子问题的解 dp = [ * (n + 1) for _ in range(m + 1)] # 动态规划求解LCS长度 for i in range(1, m + 1): for j in range(1, n + 1): if str1[i - 1] == str2[j - 1]: dp[i][j] = dp[i - 1][j - 1] + 1 else: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) # 构造最长公共子序列 lcs = "" i, j = m, n while i > 0 and j > 0: if str1[i - 1] == str2[j - 1]: lcs = str1[i - 1] + lcs i -= 1 j -= 1 elif dp[i - 1][j] > dp[i][j - 1]: i -= 1 else: j -= 1 return lcs # 示例用法 str1 = "ABCDGH" str2 = "AEDFHR" lcs = longest_common_subsequence(str1, str2) print("最长公共子序列为:", lcs) ``` 上述代码,我们使用一个二维数组`dp`来保存子问题的解,其`dp[i][j]`表示`str1`的前`i`个字符和`str2`的前`j`个字符的LCS长度。通过动态规划的方式,我们可以逐步求解出`dp[m][n]`,即整个问题的解。 最后,我们根据`dp`数组构造出最长公共子序列。从`dp[m][n]`开始,如果`str1[i-1] == str2[j-1]`,则说明当前字符属于LCS,将其添加到结果字符串,并向左上方移动一格;否则,根据`dp[i-1][j]`和`dp[i][j-1]`的大小关系决定移动方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值