web-dev-qa-db-fra.com

Retour Nombre de Scatter Palindrome d'une chaîne

Nous devons trouver des chaînes de palandrome de disques à l'intérieur de la chaîne donnée et de retourner le nombre de Palindrome Scatter dans la chaîne. Par exemple, cordes "AABB", les palindromes dispersés sont A, AA, AAB, AABB, A, ABB, B, BB et B. Ici, il y a 9 sous-chaînes qui sparquent Palindrome.

J'ai pensé à une approche de la force brute, c'est-à-dire de générer toutes les sous-chaînes et de les vérifier, mais j'aimerais trouver une meilleure approche.

3
Aman Singh

Tout d'abord, examinons comment vous pouvez trouver si une chaîne peut être un palindrome sinistre ou non.

Permet de considérer le cas où notre chaîne est composée uniquement minuscule caractères.

Une chaîne peut être un palindrome réparé si:

  1. Lorsque la longueur de la chaîne est même la suivante: tous les caractères qui se produisent dans la chaîne doivent se produire même du nombre de fois.
  2. Lorsque la longueur de la chaîne est impair: un seul caractère survient un nombre impair de fois dans la chaîne, d'autres caractères se produisent même le nombre de fois.

Donc, pour vérifier si une chaîne peut être un palindrome sinistre ou non, nous devons simplement vérifier le nombre de survie de chaque caractère de la chaîne. Cela peut être fait dans O(n) où n est la longueur de la chaîne.

Pour votre solution: la complexité du temps pour générer toutes les sous-chaînes est O (n2). Et pour vérifier si la sous-chaîne est un palindrome de disques ou non, nous avons besoin d'un autre O (n). D'où la complexité totale du temps est O (n3).

Nous pouvons réduire le O(n) facteur lors de la vérification, ce qui peut réduire la complexité totale du temps à O (n2).

Pour y parvenir, vous pouvez prendre une matrice 2-D de taille N * 26 où n est la longueur de la chaîne. Laissez ce réseau être un [n] [26]. Donc un [i] [j] stocke le nombre total de citravies de Je Caractère * de 0 à i.

Donc, pour une chaîne "Abca", votre tableau ressemblerait à

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Maintenant, pour toute sous-chaîne dit de l'index L à R, un [R] -A [L-1] vous donne la survenue de chaque caractère dans la sous-chaîne. Pour vérifier si cela peut être un palindrome Scatter ou non, nous avons besoin de 26 opérations. Par conséquent, la complexité de la solution devient O (n2 * 26) qui est asymptotiquement comme O (n2).

Ici, nous utilisons un espace supplémentaire de N * 26. Cela peut être évité par un Meilleure méthode.

Au lieu de stocker la présence de chaque caractère dans un tableau, nous le stockerons comme un entier. Si jee bit est '1' de lsb pour dire je index cela signifie que jee le caractère a eu lieu un nombre impair de fois de 0 à je indice. Si c'est '0', cela signifie que jee caractère * a eu lieu même le nombre de fois.

Considérons cet exemple où la chaîne d'entrée est "abca"

Donc, notre tableau auxiliaire sera

1 3 7 6

1 -> (0001) ['A' a eu lieu une fois]

3 -> (0011) ['A' et 'B' a eu lieu une fois]

7 -> (0111) ['A', 'B' et 'C' s'est produit une fois chacun]

6 -> (0110) ['A' est survenu deux fois tandis que 'B' et "C" a eu lieu une fois]

Donc, maintenant pour toute sous-chaîne d'index L à R A [R] XOR A [L-1] donne l'entier qui sera inclus dans la réponse finale s'il s'agit de 0 ou de la puissance de 2. (Il a tous les 0 bits ou un seul '1' bit)

Le pseudo-code est donné ci-dessous:

input string = s
ans = 0
n = s.length

for i=1:n
    A[i]=A[i-1]^(1<<(s[i-1]-97))

for i=1:n
    for j=i;n
        x=A[j]^A[i-1]
        if (x&(x-1)) == 0    //if x is a power of 2 or not 
            ans++;
        endif
    endfor
endfor

Le nombre total de palindromes dispersés est stocké dans ANS.

La complexité spatiale de cette méthode est O (n). De plus, le temps d'exécution de ce sera mieux que la méthode expliquée auparavant.

  • ici jee le caractère fait référence au personnage considérant 'a' est 0e caractère, 'B' est le premier caractère et ainsi de suite.
4
visleck