La plus longue durée du Palindromic Palindromic (avec des caractères adjacents distincts sauf pour les lettres centrales 2)

cs.stackexchange https://cs.stackexchange.com/questions/125302

Question

Vous avez reçu une chaîne S contenant des caractères anglais minuscules. Vous devez trouver la longueur de la recherche la plus importante de S qui satisfait le modèle suivant: X1, x2, x3 ... xn, xn, ... x3, x2, x1 où xi est un caractère de S. la seule contrainte est qu'aucun caractère adjacent ne doit être identique à l'exception de Xn, qui est XI!= x (i + 1) pour tout 1 <= i < n.

entrée: la chaîne: s
Sortie: l'entier: 2n
Contrainte: 1 <= | s | <= 10 ^ 3

Exemple d'entrée 1: "ACDBDEA"
Sortie de l'échantillon 1: 4
Explication: "Adda" est la recherche la plus longue suivant le motif donné.

Exemple d'entrée 2: "Abbacdeedc"
Sortie de l'échantillon 2: 6
Explication: "CDEEDC" est la plus longue suivance suivant le motif donné.

Exemple d'entrée 3: "Taker"
Exemple de sortie 3: 0
Explication: Aucune sous-préquelance ne suit le motif donné.


Cette question a été posée dans une interview codant et je ne savais pas comment résoudre. J'ai compris comment trouver la plus longue durée palindromique, mais je ne sais pas comment mettre en œuvre la partie de caractère adjacente distincte. S'il vous plaît aider. Pseudocode va bien.

Était-ce utile?

La solution

règle d'or

Voici la règle d'or de la programmation dynamique.

Lorsque des solutions à des sous-programmes plus petits ne peuvent pas être combinées à des solutions à des sous-programmes plus importants en raison des informations manquantes, étendre les sous-producteurs par Ajout de paramètres qui donnent des informations manquantes.


première tentative

$ S $ est une séquence de $ n $ lettres ou, $ S [0: N]. $

laisse $ l [i] [j] $ être la longueur de la ultérieurement palindromique la plus longue de $ s [i : j] $ . Il est facile de comprendre les cas de base et, en augmentant $ i $ et / ou en diminuant $ j $ , les relations de récurrence pour $ l [i] [j] $ .

Ajoutez maintenant l'état de la longueur même. Laisse $ e [i] [j] $ est la longueur de la recherche palindromique la plus longue de longueur de $ s [i : j] $ . Nous pouvons comprendre les cas de base et les relations de récurrence pour e [i] [j] $ , similaire à ceux de $ L [i] [j] $ .

Ajoutez maintenant l'état des lettres adjacentes distinctes, c'est-à-dire qu'aucune lettre ne peut apparaître deux fois de suite, à l'exception de la lettre au centre. Laissez $ d [i] [j] $ être la longueur de la prochaine longueur de la plus longue longueur-lien de lettre adjacente à la suite de la recherche de $ S [I: J] $ . Comme vous l'avez peut-être noté, nous ne pouvons pas comprendre les relations de récurrence pour $ D [I] [J] $ , puisque, en prolongeant une telle subséquence à une subséquence plus longue pourrait introduire répété lettres.

La règle d'or vient au sauvetage. Ajoutez un autre paramètre qui classe la lettre à la fin de la recherche la plus longue trouvée jusqu'à présent, afin que nous puissions déterminer comment prolonger correctement la recherche.

laisse $ d [i] [j] [\ lambda] $ est la longueur de la plus longue durée de la longueur de la longueur de la longueur de la longueur adjacente de $ S [I: J] $ qui se termine dans la lettre $ \ lambda $ . C'est-à-dire que nous allons calculer $ d [i] [j] [\ texte {'} a \ texte {'}] $ , $ d [i] [j] [\ texte {'} b \ texte {'}] $ , $ d [i] [j] [\ texte {'} c \ texte {'}] $ , $ \ cdots $ , $ d [i ] [J] [\ Text {'} z \ Text {'}] $ .

  • La réponse finale est la plus grande de $ \ max_ \ lambda d [0] [n-1] [\ lambda] $ et $ 0 $ .

  • supposons le premier $ \ texte {'} a \ texte {'} $ in $ s $ à ou après s [i] $ apparaît à $ s [\ vec {i _ {\ text { '} a \ texte {'}}}] $ . Supposons que le premier $ \ text {'} a \ texte {'} $ in $ s $ apparaît à $ s [\ overlefartrow {j _ {\ texte {'} a \ texte {'}}}] $ avant [J] $ recherché à l'envers. $ \ vec {i _ {\ texte {'} a \ texte {'}}} $ ou $ \ howlefartrow {j_ {\ text {'} a \ texte {'}}} $ est défini sur $ - 1 $ si $ \ texte {'} a \ texte {'} $ n'est pas trouvé de respectivement. Nous avons, pour $ j \ ge i + 2 $ ,

    $$ d [i] [j] [\ texte {'} a \ texte {'}]=commencez {cas} \ max (2, 2 + \ max _ {\ mu \ non=texte {'} a \ texte {'}} d [\ vec {i _ {\ texte {'} a \ texte {'}}} + 1] [\ Overlefrarrow {J _ \ \ Text {'} A \ Text {'}}}] [\ mu]) & \ Text {Si} 0 \ Le \ Vec {i _ {\ texte {'} a \ texte {'} }} \ lt \ overlyfartrow {j _ {\ texte {'} a \ texte {'}}}, \\ -1 & \ text {sinon,} \\ \ fin {cas} $$ $ \ mu $ traverse toutes les lettres anglaises minuscules.

  • Le boîtier de base est $$ d [i] [i] [\ text {'} a \ texte {'}]= 0. $$

généraliser $ \ text {'} a \ texte {'} $ to variable $ \ lambda $ , nous pouvons écrire la relation de récurrence et la base de base pour $ d [i] [j] [\ lambda] $ .

.

Notez que avec les informations supplémentaires énoncées dans la $ \ LambDA $ Paramètre, il est facile de déduire la relation de récurrence.

Alors que cette tentative réussit, nous pouvons faire mieux.


deuxième tentative

Nous pouvons simplifier les subproblèmes.

let $ f [i] [j] $ est la longueur de la toute la préquendance la plus longue qui commence à [i] $ et se termine à

Pan Class="Math-Conteneur"> $ S [J] $ . Ensuite, nous avons

$$ f [i] [j]=commencez {cas} \ max (2, 2 + \ max _ {\ mu \ non= s [i]} f [\ vec {i_ \ mu}] [\ overlexfartrow {j_ \ mu}]) & \ text {si} s [i]= S [j], \\ -1 & \ text {sinon,} \\ \ fin {cas} $$ $ - 1 $ signifie "non trouvé". Pour toute la lettre anglaise minuscule $ \ mu $ , $ s [\ vec {i_ \ mu}] $ est la première $ \ mu $ qui apparaît après s [i] $ et $ s [\ Overleftarrow {j_ \ mu}] $ est le premier $ \ mu $ qui apparaît avant S [J] $ recherché vers l'arrière. Si l'un d'entre eux ne peut pas être trouvé, le terme $ f [\ vec {i_ \ mu}] [\ overlefartrow {j_ \ mu}] $ est ignoré.

La réponse finale est la plus grande de $ \ max_ {i, j} f [i] [j] $ et 0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top