如果我有两个相同长度的字符串,如下所示:
'aaaaabbbbbccccc'
'bbbebcccccddddd'
是否有一种有效的方法来对齐两者,使得尽可能多的字母排列如下所示?
'aaaaabbbbbccccc-----'
'-----bbbebcccccddddd'
我能想到这样做的唯一方法就是通过编辑字符串然后迭代和比较来蛮力。
答案 0 :(得分:2)
我不确定你的意思是什么,但你可以在str上使用find
方法:
first = 'aaaaabbbbbccccc'
second = 'bbbebcccccddddd'
second_prime = '-'* first.find(second[0]) + second
first_prime = first + '-' * (len(second_prime) - len(first))
print first_prime + '\n' + second_prime
# Output:
# aaaaabbbbbccccc-----
# -----bbbebcccccddddd
答案 1 :(得分:2)
返回给出最高分数的索引,其中最高分数是具有最匹配字符的字符串。
def best_overlap(a, b):
return max([(score(a[offset:], b), offset) for offset in xrange(len(a))], key=lambda x: x[0])[1]
def score(a, b):
return sum([a[i] == b[i] for i in xrange(len(a))])
>>> best_overlap(a, b)
5
>>> a + '-' * best_overlap(a, b); '-' * best_overlap(a, b) + b
'aaaaabbbbbccccc-----'
'-----bbbebcccccddddd'
或等同地:
def best_match(a, b):
max = 0
max_score = 0
for offset in xrange(len(a)):
val = score(a[offset:], b)
if val > max_score:
max_score = val
max = offset
return max
有优化的空间,例如:
提前退出没有匹配的字符
找到最大可能匹配时提前退出
答案 2 :(得分:1)
我看不到任何其他方式而不是暴力强迫它。字符串长度的复杂性将是二次的,这可能是可以接受的,具体取决于您使用的字符串长度。
这样的事情可能是:
def align(a, b):
best, best_x = 0, 0
for x in range(len(a)):
s = sum(i==j for (i,j) in zip(a[x:],b[:-x]))
if s > best:
best, best_x = s, x
return best_x
align('aaaaabbbbbccccc', 'bbbebcccccddddd')
5
答案 3 :(得分:0)
我会在每个字符串上执行类似二进制&
函数的操作。在排列时对每个字符串进行比较,计算字母匹配的次数。然后,换一个并做同样的事情,继续前进,直到他们不再排队。以这种方式使用最匹配字母的移位是正确的输出移位,您可以在打印时添加短划线。你实际上不必为此修改字符串,只计算班次数并抵消你通过该班次金额比较字符。这不是非常有效(O(n ^ 2)= n +(n-2)+(n-4)......),但这是我能想到的最好的。