为定义执行Python代码需要很长时间

为定义执行Python代码需要很长时间,python,python-2.7,Python,Python 2.7,这是问题的定义: 给定一个小写字母字符串,确定 其删除将产生回文的字符。如果已经是 回文或不存在此类字符,则打印-1。总会有 这是一个有效的解决方案,任何正确的答案都是可以接受的。对于 例如,如果是“bcbc”,我们可以在索引处删除“b”或在索引处删除“c” 我尝试了以下代码: # !/bin/python import sys def palindromeIndex(s): # Complete this function length = len(s) index

这是问题的定义:

给定一个小写字母字符串,确定 其删除将产生回文的字符。如果已经是 回文或不存在此类字符,则打印-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)
此代码适用于较小的值。但是为了更大的投入花费了大量的时间。
以下是示例:

上面的一个是要解码的较大样本。但至少,解决方案必须针对以下输入运行:

Input (stdin)

3
aaab
baa
aaa

Expected Output

3
0
-1

如何优化解决方案?

无需将
字符串
转换为
列表
,因为您可以比较
字符串
。这将删除一个称为lot的计算,从而加快过程。要反转
字符串
,只需使用
切片

>>> s = "abcdef"
>>> s[::-1]
'fedcba'
因此,使用此选项,您可以将
函数重新写入:

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
对于你给出的第一个例子,结果是:

16722

它的计算时间约为
900ms
,而原始的
函数
的计算时间为
17000ms
,但结果仍然相同。所以很明显,这个
功能是一个巨大的改进:)

下面是一段针对特定任务进行优化的代码

首先我们计算字符串的倒数。如果
rev
等于原始版本,那么它首先是一个回文。然后,我们迭代两端的字符,并在索引上保留制表符:

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

a
将从字符串的开头保存当前字符,从字符串的结尾保存
b
i
将从字符串的开头保存索引。如果在任何点
a
!=
b
则表示必须删除
a
b
。因为总是有一个解决方案,而且总是一个字符,所以我们测试删除
a
是否会产生回文。如果是,则返回
a
的索引,即
i
。如果没有,那么删除
b
必然会产生回文,因此我们返回它的索引,从末尾开始计数。

但是它会更快吗?正如我所给出的例子,它花费了很多时间。你的逻辑是给我非常糟糕的输出。试着做点小的然后做点大的。输入(stdin)3 aaab baa aaa你的输出(stdout)-1 0 0预期的输出3 0-1这不是我想要达到的结果。@JafferWilson我更新了
函数
,出现混乱的原因是我在用链接中你的大
字符串
进行测试,需要删除的字符位于中间附近。您的示例需要第一个和最后一个字符才能正常工作,而我没有测试这部分。本质上,是一个一个接一个的错误!
for i, (a, b) in enumerate(zip(s, rev)):