我对python代码的一部分感到困惑

2024-04-25 09:03:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 字符串代码inforreturnifdefascii
1条回答
网友
1楼 · 发布于 2024-04-25 09:03:14

因此i是当前索引,遍历字符串的前半部分。 s[i]是该索引处的字母,s[n-1-i]将是第n-1-i位的字母。因为n=len(s)n-1将是字符串中的最后一个字符,我们将从那里返回i。例如,如果我们使用字符串foobari=1s[i]将是os[n-1-i]将是a。这是第一个if语句——检测我们不再是回文的第一个i,也就是说,前面的第i个字符与后面的第i个字符不同

一旦确定这对字符不匹配,我们需要确定删除其中任何一个字符是否会使字符串再次成为回文。有两种可能的情况可以实现这一点:

  1. 删除n-1-i处的字母会使字符串具有回文性
  2. 删除i处的字母会使字符串返回

我们按那个顺序试这两个箱子。但是,我们不需要重新创建整个输入字符串(减去一个字母),只需测试当前端点之间的子字符串的回文性,而不是整个字符串,就可以巧妙地节省内存。毕竟,我们知道当前i-n-1-i对之外的一切都已经是回文了。这就是你在if语句中看到的奇妙魔力——测试子字符串的回文性

s[i:n-1-i]==s[i:n-1-i][::-1]可以分解为几个部分。首先,s[i:n-1-i]是我们的in-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]向右移动了一个字符,因此结果是in-1-i标记之间的子字符串,但这次不包括s[i]处的字母和s[n-1-i]处的字母。如果这个子字符串是回文的,那么我们知道它是s[i]处的字母,为了使原始字符串成为回文。因此,我们返回i

如果这两种情况都不是真的,那么不仅输入字符串不是回文,而且无法删除一个字母使其成为一个。因此,我们返回-1表示没有解决方案

相关问题 更多 >