Q-给定ascii[a-z]范围内的小写字母字符串,确定可以删除的字符索引,使字符串成为回文。可能有不止一种解决方案,但任何一种都可以。如果单词已经是回文或没有解决方案,则返回-1。否则,返回要删除的字符的索引
有人能告诉我在我的代码的s[i] != s[n-1-i]
部分发生了什么吗
def palindromeIndex(s):
if s == s[::-1]:
return -1
n=len(s)
for i in range(n//2):
if s[i] != s[n-1-i]:
if s[i:n-1-i]==s[i:n-1-i][::-1]:
return n-1-i
elif s[i+1:n-i]==s[i+1:n-i][::-1]:
return i
return -1
我主要对这些部分感到困惑
for i in range(n//2):
if s[i] != s[n-1-i]:
if s[i:n-1-i]==s[i:n-1-i][::-1]:
return n-1-i
elif s[i+1:n-i]==s[i+1:n-i][::-1]:
return i
因此
i
是当前索引,遍历字符串的前半部分。s[i]
是该索引处的字母,s[n-1-i]
将是第n-1-i
位的字母。因为n=len(s)
,n-1
将是字符串中的最后一个字符,我们将从那里返回i
。例如,如果我们使用字符串foobar
和i=1
,s[i]
将是o
,s[n-1-i]
将是a
。这是第一个if
语句——检测我们不再是回文的第一个i
,也就是说,前面的第i
个字符与后面的第i
个字符不同一旦确定这对字符不匹配,我们需要确定删除其中任何一个字符是否会使字符串再次成为回文。有两种可能的情况可以实现这一点:
n-1-i
处的字母会使字符串具有回文性i
处的字母会使字符串返回我们按那个顺序试这两个箱子。但是,我们不需要重新创建整个输入字符串(减去一个字母),只需测试当前端点之间的子字符串的回文性,而不是整个字符串,就可以巧妙地节省内存。毕竟,我们知道当前
i
-n-1-i
对之外的一切都已经是回文了。这就是你在if
语句中看到的奇妙魔力——测试子字符串的回文性s[i:n-1-i]==s[i:n-1-i][::-1]
可以分解为几个部分。首先,s[i:n-1-i]
是我们的i
和n-1-i
标记之间的子串,但不包括n-1-i
处的字母。我们称之为sub
。在被替换回来之后,我们有了{sub
是回文,那么通过省略n-1-i
处的字符,您知道整个原始字符串是回文的。因此,我们返回n-1-i
s[i+1:n-i]==s[i+1:n-i][::-1]
的分解方式大致相同。区别在于s[i+1:n-i]
向右移动了一个字符,因此结果是i
和n-1-i
标记之间的子字符串,但这次不包括s[i]
处的字母和s[n-1-i]
处的字母。如果这个子字符串是回文的,那么我们知道它是s[i]
处的字母,为了使原始字符串成为回文。因此,我们返回i
如果这两种情况都不是真的,那么不仅输入字符串不是回文,而且无法删除一个字母使其成为一个。因此,我们返回
-1
表示没有解决方案相关问题 更多 >
编程相关推荐