这是问题定义:
给定一个小写字母串,确定索引 移除将成为回文的角色。如果已经是 回文或没有这样的字符,然后打印-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
如何优化解决方案?
答案 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
将保留字符串开头的当前字符,并从结尾保存b
。 i
将保留字符串开头的索引。如果在任何时候a
!= b
,则表示必须删除 a
或b
。由于始终存在解决方案,并且始终是一个字符,因此我们测试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
是一个显着的进步。 :)