我正在尝试对字符串执行回文切片,并将字符串的正向版本与字符串的反向版本进行比较
string = "nitin"
i = 0
j = len(string)
while i<j:
if string[i:j] == string[j-1:i-1:-1]:
print("".join(string[i:j]))
i +=1
j-=1
但是我发现string [end:start-1:-1]方法不接受诸如string [4:-1:-1]之类的参数。我理解为什么(因为索引-1与字符串的开头相同),但是我不知道如何结合使用列表切片和我的方法来克服此问题。
(我的意思是每次都可以缩短字符串,但我希望能够使用列表切片来解决我的问题),如下所示:
string = "nitin"
i = 0
j = len(string)
while i+1<j:
string=string[i:j]
if string == string[::-1]:
print(string)
i +=1
j-=1
有什么想法吗? 谢谢
编辑 我想要所有可能的次回文序列 (例如:nitin会产生nitin,iti)
答案 0 :(得分:1)
如果要检查是否为字符串回文,则只需使用reversed函数:
''.join(reversed(string)) == string
您还可以在循环中使用reversed
,因为它返回迭代器:
返回一个反向迭代器。 seq必须是具有 reverse ()方法或支持序列协议( len ()方法和 getitem ()方法)的对象。整数参数从0开始)。
答案 1 :(得分:1)
您可以使用递归获取所有子回文。结果是set
,以便删除所有重复的次回文。
def sub_palindromic(s):
if len(s) <= 1:
return set()
elif len(s) == 2:
if s[::-1] == s:
return set([s])
else:
return set()
else:
if s[::-1] == s:
return set([s]) | sub_palindromic(s[1:]) | sub_palindromic(s[:-1])
else:
return sub_palindromic(s[1:]) | sub_palindromic(s[:-1]) | sub_palindromic(s[:2]) | sub_palindromic(s[-2:])
sub_palindromic('nitin') # {'nitin', 'iti'}
sub_palindromic('abca') # set()
sub_palindromic('abab') # {'bab', 'aba'}
sub_palindromic('abba') # {'abba', 'bb'}
sub_palindromic("aaaaa") # {'aa', 'aaa', 'aaaa', 'aaaaa'}
sub_palindromic('abcbacab') # {'abcba', 'aca', 'bacab', 'bcb'}
sub_palindromic("1122bb2211") # {'11', '1122bb2211', '122bb221', '22', '22bb22', '2bb2', 'bb'}
答案 2 :(得分:0)
为什么不仅仅将[::-1]
和常规数组切片结合起来?
In [2]: a = [1,2,3,4,5,6]
In [4]: a[::-1]
Out[4]: [6, 5, 4, 3, 2, 1]
In [13]: a[::-1][:5]
Out[13]: [6, 5, 4, 3, 2]
所以我想如果您将其应用于可变长度的字符串
In [14]: f = 'pallapi'
In [15]: f[::-1][1:]
Out[15]: 'pallap'
In [16]: f[::-1][1:] == f[:-1]
Out[16]: True
答案 3 :(得分:0)
你可以做
>>> foo = 'abcde'
>>> foo[::-1]
'edcba'
>>> bar = 'nidin'
>>> bar == bar[::-1]
True
>>> foo == foo[::-1]
False
>>>