假设我有两个字符串s1 = "1234"
和s2 ="34567"
,那么s1
和s2
之间最长的公共后缀前缀是"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
我想要一个小巧而聪明的东西!
3条答案
按热度按时间cedebl8k1#
你的算法中的逻辑是你能得到的最简单的,但是你绝对可以紧致化这个符号。例如,检查大小为
n
的前缀与大小为n
的后缀,简单地说:用于检查字符串长度的三元运算符是
一个范围可以自己倒退。
range(x)
的反方向是您可以创建一个迭代器,对
n
的每个递减值进行检查,并返回第一个非零结果。幸运的是,next
接受第二个参数,它表示迭代器为空时的默认值:这是必不可少的一句俏皮话。更清晰的解决方案可能是:
作为一项规则,保持你的功能和打印分开。获取一个值,然后处理它(无论是通过打印还是其他方式)
nx7onnlm2#
以下是几个替代实现:
s1
的后缀必须以s2[0]
开头。因此,使用s1.find(s[0])
查找候选起点。此外,可以使用s2.startswith()
来代替对s2
的迭代。我不知道它是否更快,但意图很明显。如果你使用的是Python 3.8,walrus运算符可以让你这样写:
使用
s1.endswith()
也可以做到这一点:为了好玩,让我们使用正则表达式:
xtupzzrd3#
这个方法的作用是:
for
循环查找s1
的长度。然后,它会迭代该长度。如果s1[i]
等于s2
的开始,则检查s1[i::]
是否在s2
中。如果这是真的,则打印出s1[i::]