0
votes

Compter toutes les sous-chaînes Palindrome dans une chaîne

Ici, je veux trouver tous les palindromes possibles dans une chaîne.

palindrome signifiant: - un mot, une phrase ou une séquence qui lit la même chose à l'envers qu'à l'avant,

par exemple madame ou nonne.

Alors j'ai pris une ficelle. Divisez-le en une liste. Puis a pris chaque élément de la liste à la fois. Puis a pris des combinaisons de tous les éléments jusqu'au dernier élément de la liste.

tat
otato

Je ne peux pas obtenir de sortie même après avoir écrit le code aussi logique que possible

Par exemple:-

si a="Rotator"

production:-

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)

et beaucoup si possible dedans.

Je ne peux pas trouver où je me suis trompé ou où se trouve une échappatoire.


0 commentaires

4 Réponses :


0
votes

Les programmes ont deux défauts:

  • Fractionner sans argument ne fait pas vraiment ce que vous voulez. Il n'est en fait pas nécessaire de diviser dans une liste, vous pouvez faire toutes les opérations sur une chaîne
  • Reverse est un reverse en place si vous souhaitez obtenir une nouvelle utilisation de valeur reversed . Ici, vous comparez le tableau à None.

Programme fixe

R
o
otato
t
tat
a
t
o

Les sorties:

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)


4 commentaires

Les codes fonctionnent très bien, mais je ne peux pas comprendre comment `` .join a fonctionné ici, car il est utilisé pour joindre des éléments dans une liste pour former une chaîne, et ici vous n'avez converti la chaîne en liste nulle part.


@AakibShaikh reversed renvoie un générateur, pas une chaîne. C'est une fonction générique qui peut inverser des listes, des tuples, des chaînes ... c'est pourquoi vous devez join la valeur de retour.


Quel est le générateur?


@AakibShaikh Iterators plus ou moins wiki.python.org/moin/Generators



1
votes

Tout d'abord, il n'est pas nécessaire de convertir une chaîne en une liste de caractères Ici, vous essayez de convertir une chaîne en une liste de caractères, mais la méthode de fractionnement sur sting ne vous donnera pas la liste de caractères requise. Pour cela, vous devez nous faire une list(s) . Au lieu de cela, la meilleure approche est le String Slicing .

L'extrait de code suivant vous donnera une idée exacte.

m
a
d
a
m
ada
madam

En fournissant la chaîne madam cela donne une sortie comme:

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


0 commentaires

0
votes

Félicitations pour avoir obtenu la bonne logique centrale (deux boucles for avec des conditions appropriées) pour obtenir un palindrome.

Puisque vous nous demandez de repérer les erreurs, je pense que je peux repérer deux erreurs. Première

enter the string:-xyzrotatorabc
rotator
otato
tat

Je pense, peut-être, que vous aviez l'intention de faire une liste avec tous les caractères séparés, un caractère à la fois. Cependant, split () cherchera un séparateur, qui dans votre cas est None. Selon la documentation officielle "Si sep n'est pas spécifié ou est None, un algorithme de fractionnement différent est appliqué". Cet algorithme ne correspond pas à vos besoins.

Si tout ce que vous vouliez est de séparer les caractères d'une chaîne dans une liste, vous pouvez simplement faire comme ci-dessous.

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)

Deuxième problème: ce qui se passe dans votre code, c'est que le b est une liste avec un seul membre (qui est la chaîne elle-même). Vous pouvez le vérifier en tapant la ligne suivante, juste après avoir défini b.

print(b,len(b))

Cela signifie que la longueur est de 1 pour b. Cela signifie à son tour que l'exécution entre dans la première boucle mais qu'elle n'entre pas dans la deuxième boucle car la condition est range (1,1) ce qui signifie une liste vide!

J'ai apporté quelques modifications mineures à votre code et je l'ai vérifié. On dirait que cela donne le résultat souhaité.

b=list(a)

Lorsque j'ai exécuté le code ci-dessus pour 'xyzrotatorabc' où le palindrome 'rotator' est intégré, j'ai obtenu la sortie suivante.

b=a.split()

Je ne sais pas si j'ai été utile (pour les problèmes que vous avez demandés).


1 commentaires

Vous étiez exactement au point merci. Si b = ["sdasda"] et quand je donne b [0] il renvoie correctement s, pour b [1] d et ainsi de suite, alors pourquoi le compilateur le prend-il comme un élément 1?



0
votes

Deux hypothèses de base à garder à l'esprit:

(1) 1 chaînes de caractères / sous-chaînes ne sont pas considérées comme des palindromes, et (2) vous voulez compter UNIQUEMENT des sous-chaînes UNIQUE (la chaîne d'entrée d'origine est déjà unique)

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)


0 commentaires