首页 > 解决方案 > 无需切片或剥离的单个特定字符删除,

问题描述

如何从字符串中删除单个字符?基本上我有一个像这样的字符串: abccbaa

我希望删除第一个和最后一个字母。使用string.rstriporstring.lstrip方法,所有出现的事件都被删除,我得到一个字符串bccb。也一样replace。有没有办法这样做?我不能导入任何东西,我不能使用切片(访问单个字母除外)。我也不能使用任何类型的循环。

为了得到全貌,我需要编写一个递归回文算法。我目前的代码是:

def is_palindrome(s):
    if s == '':
        return True
    if s[0] != s[-1]:
        return False
    else:
        s = s.replace(s[0], '')
        s = s.replace(s[-1], '')
        return is_palindrome(s)


print is_palindrome("abccbaa")

如您所见,除非提供与打印行中的字符串类似的字符串,否则它将起作用,因为剥离了多个“边缘”字母。

标签: pythonstring

解决方案


不需要切片/替换字符串,而且成本很高,因为它会一遍又一遍地创建字符串。在字符串处理起来不太方便的语言中(如 C),你甚至不会想到会这样做。

当然,您需要某种循环,但递归会解决这个问题。

您可以“以旧方式”执行此操作,只需递归地传递开始和结束索引,并使用嵌套函数将开始条件隐藏给调用者:

def is_palindrome(s):
    def internal_method(s,start,end):
        if start>=end:
            return True
        if s[start] != s[end]:
            return False
        else:
            return internal_method(s,start+1,end-1)
    return internal_method(s,0,len(s)-1)

start如果遇到end或检查的字母不匹配,则递归停止(当然结果不同)

测试一点似乎有效:)

>>> is_palindrome("")
True
>>> is_palindrome("a")
True
>>> is_palindrome("ab")
False
>>> is_palindrome("aba")
True
>>> is_palindrome("abba")
True
>>> is_palindrome("abbc")
False

推荐阅读