在更大的字符串中查找嵌套序列

时间:2013-09-22 06:05:14

标签: python algorithm python-2.7

任务是找到一个数字序列,可以通过某个数字转置或反转然后转置,嵌套在另一个相等或更大的数字集合中。输入来自文本文件。如果按原样或转置找到数字,则输出找到它的起始索引,如果它被反转或反转并转置,输出索引后跟倒置。

示例 - 如果要查找的数字是67654,则可以找到45432(向下换算2)或32345(倒置)或54567(倒置并向上换算2)

Input    
67654      
14676545  
43234545679    
905    
#   

第一行是搜索的内容(67654),其余行是搜索内容。

Output    
3    
7    
10 inverted    
14 inverted  

我的想法是建立一个数字列表,如果要查找的数字和该数字反转,则每个数字之间的差异。例如67654会列出[-1,1,1,1]。然后,我会循环遍历字符串的每个数字,但使用滑动窗口检查它是否出现。我对倒置也做了同样的事情。

diffs = [int(name[x]) - int(name[x + 1]) for x in range(0, len(name) - 1)] #name stores the fist line of input
invertedName = ''.join([str(9-int(x)) for x in name])

currDiffs = []
for i in range(len(name)-1):
    currDiffs.append(int(piece[i]) - int(piece[i+1])) #piece is the string being searched

for i in range(len(name)- 1, len(piece) - 1):
    currDiffs.pop(0)
    currDiffs.append(int(piece[i]) - int(piece[i+1]))
    Compare(diffs,currDiffs) # check if theyre the same

这样做我的回答我发现自己几乎所有答案都不正确。关于如何修复我的方法或者如果出现问题的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不是最高效的解决方案,但似乎有效:

def find_diffs(inval):
    inval = map(int, inval)
    plain = [i - inval[0] for i in inval[1:]]
    return plain, [-i for i in plain]


def check(inval, against):
    inval_diff, _ = find_diffs(inval)
    print against, inval
    for i in range(0, len(against) - len(inval) + 1):
        test, inverted_test = find_diffs(against[i: i + len(inval)])
        if test == inval_diff:
            print i
        elif test == inval_inverted_diff:
            print i, "inverted"

inval = '67654'

check(inval, '14676545')
check(inval, '43234545679')
check(inval, '1467654543234545679905')

<强>输出

14676545 67654
2
43234545679 67654
1 inverted
5 inverted
1467654543234545679905 67654
2
6
9 inverted
13 inverted

这是做什么的?

这里的想法是,对于给定的输入,我们可以将输入转换为值列表,其中第一个值始终为0,其余值是它与第一个值之间的差值。例如:

1234 => 0, 1, 2, 3
5463 => 0, -1, 1, -2
6667 => 0, 0, 0, 1

我们可以类似地对任何数字进行比较。因此,为了比较,我们从我们正在比较的数字中取出前N个数字,其中N是源数字的长度。

在最后一个示例中,源编号为67654,因此长度为5. against编号为1467654543234545679905,因此前5位为14676。

使用上述差异公式:

67654 => 0, 1, 0, -1, -2
14676 => 0, 3, 5, 6, 5

所以这不是一场比赛。你继续这样做,滑动against数字的起始索引,直到你耗尽列表。

唯一需要考虑的是倒置。对于反向检查,您可以将差值列表中的每个数字乘以-1。偏移无关紧要,因为它是不变的。

如果您需要偏移值,事情会稍微复杂一些。