假设我有2个字符串
AAABBBCCCCC
和
AAAABBBBCCCC
使这些字符串尽可能相似,因为我只能删除我应该
的字符以便他们成为
AAABBBCCCC
找出从每个字符串中删除哪些字符的有效算法是什么?
我正在粉碎我的脑细胞,想着一个涉及弦的子串的溶质,在另一个字符串中寻找它们。
答案 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()组是两个字符串的距离。接下来,我可以找出应该删除哪些字符。 这是我的想法,我希望它可以帮到你。