Python 查找在删除元素字符串时变为回文的索引
我正在写这个黑客问题的解决方案- 我尝试过以下代码:Python 查找在删除元素字符串时变为回文的索引,python,python-2.7,Python,Python 2.7,我正在写这个黑客问题的解决方案- 我尝试过以下代码: T = int(raw_input()) for t in xrange(T): s = raw_input() index = -1 if s != s[::-1]: for i in xrange(len(s)): temp = s[:i:] + s[i+1::] if temp == temp[::-1]: inde
T = int(raw_input())
for t in xrange(T):
s = raw_input()
index = -1
if s != s[::-1]:
for i in xrange(len(s)):
temp = s[:i:] + s[i+1::]
if temp == temp[::-1]:
index = i
break
print index
但是当我提交它时,在14个测试用例中,大约有8个需要很长时间来计算(约5-7秒),其中1个需要10秒以上,所以HackerRank甚至没有显示结果(是否给出了正确的输出)。
看来我的代码效率很低。请帮助我让它运行得更快。加速代码的最简单方法是删除每个索引的切片,以防字符串不是回文。如果字符串的最大长度不是回文,则以下行将生成超过200000个切片:
temp=s[:i:+s[i+1::]
您可以从头开始检查字符串,直到发现差异。一旦找到,您可以生成删除第一个或最后一个字母的切片,并检查这是否是回文。如果您删除了第一个字符,并且结果不是回文,您知道最后一个字符是正确的解决方案,因为问题陈述保证:
T = int(raw_input())
for t in xrange(T):
s = raw_input()
length = len(s)
for i in xrange(length / 2):
if s[i] != s[length - i - 1]:
if s[i + 1:length - i] == s[length - i - 1:i:-1]:
print i
else:
print length - i - 1
break
else:
print -1
加快代码速度的最简单方法是删除每个索引的切片,以防字符串不是回文。如果字符串的最大长度不是回文,则以下行将生成超过200000个切片:
temp=s[:i:+s[i+1::]
您可以从头开始检查字符串,直到发现差异。一旦找到,您可以生成删除第一个或最后一个字母的切片,并检查这是否是回文。如果您删除了第一个字符,并且结果不是回文,您知道最后一个字符是正确的解决方案,因为问题陈述保证:
T = int(raw_input())
for t in xrange(T):
s = raw_input()
length = len(s)
for i in xrange(length / 2):
if s[i] != s[length - i - 1]:
if s[i + 1:length - i] == s[length - i - 1:i:-1]:
print i
else:
print length - i - 1
break
else:
print -1
最有效的方法是从左右两边进行检查,打破不平等:
for i in range(int(input())):
s=input()
if s==s[::-1]:
print(-1)
else:
for i in range(int(len(s)/2)):
if s[i]!=s[len(s)-1-i]:
print(i if ((s[:i]+s[i+1:])==(s[:i]+s[i+1:])[::-1]) else len(s)-1-i)
break
显然,我也是该网站的一员,执行了我的代码,它以0.01秒和0.02秒通过了所有测试用例。最有效的方法是从左右两侧进行检查,并打破不平等:
for i in range(int(input())):
s=input()
if s==s[::-1]:
print(-1)
else:
for i in range(int(len(s)/2)):
if s[i]!=s[len(s)-1-i]:
print(i if ((s[:i]+s[i+1:])==(s[:i]+s[i+1:])[::-1]) else len(s)-1-i)
break
显然,我也是该网站的一员,执行了我的代码,它以0.01秒和0.02秒通过了所有测试用例,你知道这些字符串的大小吗?
s[::-1]
如果是一个大对象(它生成了一个就地副本,O(n))@AlexO'Neill 100005 charsYes,正如@Ivo所指出的,它超过100000个字符,那么它会导致速度变慢。我想这就是为什么最后几个测试用例要花这么多时间的原因。你知道这些字符串的大小吗?s[::-1]
如果是一个大对象(它生成了一个就地副本,O(n))@AlexO'Neill 100005 charsYes,正如@Ivo所指出的,它超过100000个字符,那么它会导致速度变慢。我想这就是为什么最后几个测试用例要花这么多时间的原因。谢谢。)我现在明白了。谢谢我现在明白了。