假设我有两个字符串
AAABBBCCCCC
和
AAAABBBBCCCC
为了尽可能使这些字符串相似,假设我只能删除一些字符,请按照以下方式进行操作:
- 从第一个字符串中删除最后一个C
- 从第二个字符串中删除最后一个A和最后一个B
这样它们就会变成:
AAABBBCCCC
如何高效地找出需要从每个字符串中删除的字符?
我正在思考一种解决方案,涉及到子字符串,并在另一个字符串中查找它们。
假设我有两个字符串
AAABBBCCCCC
和
AAAABBBBCCCC
为了尽可能使这些字符串相似,假设我只能删除一些字符,请按照以下方式进行操作:
这样它们就会变成:
AAABBBCCCC
如何高效地找出需要从每个字符串中删除的字符?
我正在思考一种解决方案,涉及到子字符串,并在另一个字符串中查找它们。
Levenshtein距离可以计算将一个字符串转换为另一个字符串所需进行的更改数量。对源字符串稍作修改,您可以得到不仅距离,还有所需的转换。
使用 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
''.join(s[2] for s in difflib.ndiff(s1,s2) if s[0] == ' ')
。 - jamylak不知道它是否是最快的,但是就代码而言,至少它很短:
import difflib
''.join([c[-1] for c in difflib.Differ().compare('AAABBBCCCCC','AAAABBBBCCCC') if c[0] == ' '])
我认为正则表达式可以解决这个问题。这是一个字符串距离问题。 我的意思是,我们有两个字符串:
str1 = 'abc'
str2 = 'aabbcc'
regex = '(\w*)'+'(\w*)'.join(list(str1))+'(\w*)'
然后,我们可以搜索:
matches = re.search(regex,str2)
我使用圆括号来分组我感兴趣的部分。这些匹配组的matches.group()是两个字符串之间的距离。接下来,我可以确定应该删除哪些字符。这是我的想法,希望能对你有所帮助。