计算字符串中的所有回文子字符串

时间:2019-09-01 08:12:08

标签: python string reverse palindrome

在这里,我想在字符串中查找所有可能的回文。

回文的含义:-一个单词,词组或序列,其向后读与向前读相同,

例如夫人或修女。

所以我拿了一个琴弦。将其拆分为列表。然后一次获取列表中的每个元素。然后将所有元素组合到列表的最后一个元素。

a=str(input("enter the string:-"))

b=a.split()

for i in range(len(b)):

    for j in range(i+1,len(b)):

        t=b[i:j]

        r=t.reverse()

        if t == r:

            print(t)

即使我尽可能写逻辑代码,也无法获得任何输出

例如:-

如果a="Rotator"

输出:-

tat
otato

,如果可能的话,还有很多。

我找不到错误的地方或漏洞。

4 个答案:

答案 0 :(得分:0)

程序有两个缺陷:

  • 不带参数的拆分并不能真正做到您想要的。实际上没有必要拆分列表,您可以对字符串进行所有操作
  • 如果您想使用reversed获得新的值,
  • Reverse是一个就地反向。在这里,您将数组与“无”进行比较。

固定程序

a=str(input("enter the string:-"))

for i in range(len(a)):
    for j in range(i+1,len(a)):
        t=a[i:j]
        r=''.join(reversed(t))
        if t == r:
            print(t)

输出:

R
o
otato
t
tat
a
t
o

答案 1 :(得分:0)

首先,无需将字符串转换为字符列表 在这里,您尝试将字符串转换为字符列表,但是在sting上使用split方法将无法提供所需的字符列表。为此,您必须list(s)。最好的方法是String Slicing

以下代码段将为您提供确切的想法。

def isPall(s): 
    return s[::-1]==s

s=str(input("enter the string:-"))

for i in range(1, len(s)+1): 
    start = 0 
    end = i 
    while end<len(s)+1: 
        if isPall(s[start:end]): 
            print(s[start:end]) 
        start+=1 
        end+=1

在提供字符串madam时,输出如下:

m
a
d
a
m
ada
madam

答案 2 :(得分:0)

恭喜您正确地制定了用于回文的中央逻辑(两个具有适当条件的循环)。

由于您要我们发现错误,所以我认为我可以发现两个错误。 首先

b=a.split()

我想,也许您打算制作一个列表,其中所有字符都分开,一次一个字符。但是split()将寻找一个分隔符,在您的情况下为None。根据官方文档“如果未指定sep或为None,则将应用其他拆分算法”。该算法不符合您的要求。

如果您只想将字符串中的字符分成一个列表,则只需执行以下操作即可。

b=list(a)

第二个问题:您的代码中发生的事情是b是具有单个成员的列表(字符串本身)。在定义b之后,可以通过键入以下行来检查它。

print(b,len(b))

这意味着b的长度为1。反过来,这意味着执行进入第一个循环,但没有进入第二个循环,因为条件是range(1,1),这意味着一个空列表!

我对您的代码做了一些小的更改,并进行了检查。看起来它正在提供您想要的结果。

a=str(input("enter the string:-"))

b=list(a)

for StartSlice in range(len(b)):
    for EndSlice in range(StartSlice,len(b)+1,1):
        ForwardString = "".join(b[StartSlice:EndSlice])
        if ForwardString==ForwardString[::-1] and len(ForwardString)>1:
            print(ForwardString)

当我为嵌入回文“ rotator”的'xyzrotatorabc'运行以上代码时,得到以下输出。

enter the string:-xyzrotatorabc
rotator
otato
tat

我不确定(对于您所要解决的问题)是否有帮助。

答案 3 :(得分:0)

要记住的两个基本假设:

(1)1个字符字符串/子字符串不被视为回文,(2)您只想计算唯一的子字符串(原始输入字符串已经是唯一的)

def count_palindrome_substrings(string):
    # substrings set can only contain UNIQUE values
    substrings = set()
    
    for i in range(len(string)):
        for j in range(i + 1, len(string) + 1):
            sub = ''.join(string[i:j])
            # is sub a palindrome and is its length greater than 1
            if str(sub) == str(sub)[::-1] and len(sub) > 1:
                substrings.add(sub)

    return len(substrings)