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

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

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

  1. s1 = "1234"
  2. s2 = "34567"
  3. length1 = len(s1)
  4. length2 = len(s2)
  5. length = (length1 if length1<= length2 else length2)
  6. for i in reversed(range(0, length)):
  7. if s1[-i - 1:] == s2[:i + 1]:
  8. print(s1[-i - 1:])
  9. break
  10. elif i > 0:
  11. continue
  12. else:
  13. print("no common suffix prefix")

输出:

  1. 34

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

cedebl8k

cedebl8k1#

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

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

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

  1. min(len(s1), len(s2))

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

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

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

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

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

  1. def common_fix(s1, s2):
  2. steps = range(min(len(s1), len(s2)) - 1, -1, -1)
  3. 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的迭代。我不知道它是否更快,但意图很明显。

  1. def suffix_prefix_1(s1, s2):
  2. i = s1.find(s2[0])
  3. while i >= 0:
  4. if s2.startswith(s1[i:]):
  5. return s1[i:]
  6. i = s1.find(s2[0], i+1)
  7. return ''

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

  1. def suffix_prefix_1A(s1, s2):
  2. while (i := s1.find(s2[0])) >= 0:
  3. if s2.startswith(s1[i:]):
  4. return s1[i:]
  5. return ''

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

  1. def suffix_prefix_2(s1, s2):
  2. e= len(s2)
  3. while e > 0:
  4. if s1.endswith(s2[:e]):
  5. return s2[:e]
  6. e = s2.rfind(s1[-1], 0, e-1) + 1
  7. return ''

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

  1. import re
  2. def suffix_prefix_3(s1, s2):
  3. match = re.search(f"^{'?'.join(s1)}", s2)
  4. return match[0] if match else ''
展开查看全部
xtupzzrd

xtupzzrd3#

这个方法的作用是:

  1. s1="1234"
  2. s2="34567"
  3. for i in range(len(s1)):
  4. if s1[i] == s2[0]:
  5. if s1[i::] in s2[0:len(s1[i::])]:
  6. print(s1[i::])

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

相关问题