将两个字符串合二为一

时间:2012-05-06 10:52:46

标签: python string algorithm

假设我有2个字符串

AAABBBCCCCC

AAAABBBBCCCC

使这些字符串尽可能相似,因为我只能删除我应该

的字符
  • 从第一个字符串中删除最后一个C
  • 从第二个字符串中删除最后一个A和最后一个B

以便他们成为

AAABBBCCCC

找出从每个字符串中删除哪些字符的有效算法是什么?

我正在粉碎我的脑细胞,想着一个涉及弦的子串的溶质,在另一个字符串中寻找它们。

4 个答案:

答案 0 :(得分:15)

Levenshtein distance可以计算将一个字符串转换为另一个字符串所需的更改次数。对源进行一些小改动,您不仅可以获得距离,还可以获得所需的转换。

答案 1 :(得分:14)

如何使用difflib

import difflib

s1 = 'AAABBBCCCCC'
s2 = 'AAAABBBBCCCC'

for difference in difflib.ndiff(s1, s2):
    print difference,
    if difference[0] == '+':
        print 'remove this char from s2'
    elif difference[0] == '-':
        print 'remove this char from s1'
    else:
        print 'no change here'

这将打印出两个字符串之间的差异,然后您可以使用它们来消除差异。这是输出:

  A no change here
  A no change here
  A no change here
+ A remove this char from s2
+ B remove this char from s2
  B no change here
  B no change here
  B no change here
  C no change here
  C no change here
  C no change here
  C no change here
- C remove this char from s1

答案 2 :(得分:1)

不知道它是否是最快的,但正如代码所说,它至少是短暂的:

import difflib
''.join([c[-1] for c in difflib.Differ().compare('AAABBBCCCCC','AAAABBBBCCCC') if c[0] == ' '])

答案 3 :(得分:0)

我认为正则表达式可以做到这一点。这是一个字符串距离问题。 我的意思是。我们有两个字符串:

str1 = 'abc'
str2 = 'aabbcc'

首先,我选择短片,并构造一个正则表达式,如:

regex = '(\w*)'+'(\w*)'.join(list(str1))+'(\w*)'

然后,我们可以搜索:

matches = re.search(regex,str2)

我使用圆括号对我感兴趣的部分进行分组。 这些matches.group()组是两个字符串的距离。接下来,我可以找出应该删除哪些字符。 这是我的想法,我希望它可以帮到你。