首页 > 解决方案 > 使用蛮力在python 3中查找字符串中的所有子字符串

问题描述

我想用蛮力找到所有子字符串'A' to 'B'L = ['C', 'A', 'B', 'A', 'A', 'X', 'B', 'Y', 'A']这就是我所做的:

def find_substring(L):
    t = 0
    s = []
    for i in range(len(L) - 1):
        l = []
        if ord(L[i]) == 65:
            for j in range(i, len(L)):
                l.append(L[j])
                if ord(L[j]) == 66:
                    t = t + 1
                    s.append(l)
    return s, t

现在我想要输出:

[['A','B'], ['A','B','A','A','X','B'], ['A','A','X','B'], ['A','X','B']]

但我得到:

[['A','B','A','A','X','B','Y','A'],['A','B','A','A','X','B','Y','A'],['A','A','X','B','Y','A'],['A','X','B','Y','A']]

有人可以告诉我我做错了什么吗?

标签: pythonstringpython-3.xsubstringbrute-force

解决方案


问题是 lists包含对列表的引用l

因此,即使您将正确的l列表附加到s,它们也会在被附加后更改,因为j循环的未来迭代会修改l列表。

您可以通过附加列表的副本来解决此问题ll[:].

此外,您可以直接比较字符串,无需转换为 ASCII。

def find_substring(L):
    s = []
    for i in range(len(L) - 1):
        l = []
        if L[i] == 'A':
            for j in range(i, len(L)):
                l.append(L[j])
                if L[j] == 'B':
                    s.append(l[:])
    return s

现在有效:

>>> find_substring(['C', 'A', 'B', 'A', 'A', 'X', 'B', 'Y', 'A'])
[['A', 'B'], ['A', 'B', 'A', 'A', 'X', 'B'], ['A', 'A', 'X', 'B'], ['A', 'X', 'B']]

推荐阅读