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