如何找到最长的公共后缀前缀之间的两个字符串在python的方式可能使用库函数?

lsmepo6l  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(148)

假设我有两个字符串s1 = "1234"s2 ="34567",那么s1s2之间最长的公共后缀前缀是"34"。我想知道是否有任何Python方法可以真实的获得这个匹配部分("34")。
我可以像下面这样用简单的方法来做,但是我很想知道是否有一个有趣的库函数或算法来完成这个任务。

s1 = "1234"
s2 = "34567"
length1 = len(s1) 
length2 = len(s2)

length = (length1 if length1<= length2 else length2)

for i in reversed(range(0, length)):
    if s1[-i - 1:] == s2[:i + 1]:
        print(s1[-i - 1:])
        break
    elif i > 0:
        continue
    else:
        print("no common suffix prefix")

输出:

34

我想要一个小巧而聪明的东西!

cedebl8k

cedebl8k1#

你的算法中的逻辑是你能得到的最简单的,但是你绝对可以紧致化这个符号。例如,检查大小为n的前缀与大小为n的后缀,简单地说:

s1[-n:] == s2[:n]

用于检查字符串长度的三元运算符是

min(len(s1), len(s2))

一个范围可以自己倒退。range(x)的反方向是

range(x - 1, -1, -1)

您可以创建一个迭代器,对n的每个递减值进行检查,并返回第一个非零结果。幸运的是,next接受第二个参数,它表示迭代器为空时的默认值:

common = next((s2[:n] for n in range(min(len(s1), len(s2)) - 1, -1, -1) if s1[-n:] == s2[:n]), '')

这是必不可少的一句俏皮话。更清晰的解决方案可能是:

def common_fix(s1, s2):
    steps = range(min(len(s1), len(s2)) - 1, -1, -1)
    return next((s2[:n] for n in steps if s1[-n:] == s2[:n]), '')

作为一项规则,保持你的功能和打印分开。获取一个值,然后处理它(无论是通过打印还是其他方式)

nx7onnlm

nx7onnlm2#

以下是几个替代实现:
s1的后缀必须以s2[0]开头。因此,使用s1.find(s[0])查找候选起点。此外,可以使用s2.startswith()来代替对s2的迭代。我不知道它是否更快,但意图很明显。

def suffix_prefix_1(s1, s2):
    i = s1.find(s2[0])
    while i >= 0:
        if s2.startswith(s1[i:]):
            return s1[i:]

        i = s1.find(s2[0], i+1)

    return ''

如果你使用的是Python 3.8,walrus运算符可以让你这样写:

def suffix_prefix_1A(s1, s2):
    while (i := s1.find(s2[0])) >= 0:
        if s2.startswith(s1[i:]):
            return s1[i:]

    return ''

使用s1.endswith()也可以做到这一点:

def suffix_prefix_2(s1, s2):
    e= len(s2)
    while e > 0:
        if s1.endswith(s2[:e]):
            return s2[:e]
        e = s2.rfind(s1[-1], 0, e-1) + 1

    return ''

为了好玩,让我们使用正则表达式:

import re

def suffix_prefix_3(s1, s2):
    match = re.search(f"^{'?'.join(s1)}", s2)
    return match[0] if match else ''
xtupzzrd

xtupzzrd3#

这个方法的作用是:

s1="1234"
s2="34567"
for i in range(len(s1)):
    if s1[i] == s2[0]:
        if s1[i::] in s2[0:len(s1[i::])]:
            print(s1[i::])

for循环查找s1的长度。然后,它会迭代该长度。如果s1[i]等于s2的开始,则检查s1[i::]是否在s2中。如果这是真的,则打印出s1[i::]

相关问题