花费很长时间来执行定义的Python代码

时间:2017-11-11 10:06:01

标签: python python-2.7

这是问题定义:

  

给定一个小写字母串,确定索引   移除将成为回文的角色。如果已经是   回文或没有这样的字符,然后打印-1。永远都会   是一个有效的解决方案,任何正确的答案都可以接受。对于   例如,如果是“bcbc”,我们可以删除索引处的“b”或索引处的“c”。

我试过这段代码:

# !/bin/python

import sys

def palindromeIndex(s):
    # Complete this function
    length = len(s)
    index = 0
    while index != length:
        string = list(s)
        del string[index]
        if string == list(reversed(string)):
            return index
        index += 1

    return -1

q = int(raw_input().strip())
for a0 in xrange(q):
    s = raw_input().strip()
    result = palindromeIndex(s)
    print(result)

此代码适用于较小的值。但是为更大的投入花费了大量的时间 以下是示例:Link to sample

上面的一个是要解码的更大的样本。但是在解决方案中必须运行以下输入:

Input (stdin)

3
aaab
baa
aaa

Expected Output

3
0
-1

如何优化解决方案?

2 个答案:

答案 0 :(得分:1)

以下是针对 very 任务

进行了优化的代码
def palindrome_index(s):
    # Complete this function
    rev = s[::-1]
    if rev == s:
        return -1

    for i, (a, b) in enumerate(zip(s, rev)):
        if a != b:
            candidate = s[:i] + s[i + 1:]
            if candidate == candidate[::-1]:
                return i
            else:
                return len(s) - i - 1

首先我们计算字符串的反转。如果rev等于原始版本,那么它就是一个回文。然后我们在两端迭代字符,同时在索引上保留标签:

for i, (a, b) in enumerate(zip(s, rev)):

a将保留字符串开头的当前字符,并从结尾保存bi将保留字符串开头的索引。如果在任何时候a!= b,则表示必须删除 ab。由于始终存在解决方案,并且始终是一个字符,因此我们测试a的删除是否会导致回文结果。如果是,我们返回a的索引,即i。如果没有,那么必要时,删除b必须导致回文,因此我们返回其索引,从结尾开始计算。

答案 1 :(得分:0)

您无需将string转换为list,因为您可以比较strings。这将删除一个被称为批次的计算,从而加速该过程。要撤消string,您只需使用slicing

>>> s = "abcdef"
>>> s[::-1]
'fedcba'

因此,使用此功能,您可以将function重新编写为:

def palindromeIndex(s):
    if s == s[::-1]:
        return -1
    for i in range(len(s)):
        c = s[:i] + s[i+1:]
        if c == c[::-1]:
            return i
    return -1

和你问题的测试:

>>> palindromeIndex("aaab")
3
>>> palindromeIndex("baa")
0
>>> palindromeIndex("aaa")
-1

对于您提供的link中的第一个,结果是:

16722

在大约900ms中与原始function进行比较计算得出17000ms,但仍然给出了相同的结果。很明显,这function是一个显着的进步。 :)