Problème A: string [] palindrome la plus longue sous-chaîne

La description

        Entrez une chaîne, qui est obtenu le plus long palindrome sous-chaîne. Signification de sous-chaîne est la suivante: le segment de chaîne dans la chaîne d'origine de suite. Palindrome sens est: positif, regarder en arrière vers l'avant et regarder la même chose. Comme abba et yyxyy. Pour déterminer palindromes, vous devez ignorer la ponctuation et les espaces, et en ignorant le cas, mais la sortie doit rester intacte (dans la séquence palindromique d'en-tête et la remorque ne pas imprimer des caractères supplémentaires). La longueur de la chaîne d'entrée pas plus de 5000, et occupe une seule ligne. La plus longue séquence palindromique à délivrer, s'il y a multiple, la position de départ de la sortie la plus à gauche.

Contribution

Sa chaîne, la longueur de la chaîne de ne pas plus de 5000.

Production

la plus longue chaîne de sous-chaîne palindrome.

Exemple d'entrée

Confuciuss dit: Madame, je suis Adam.

Exemple de sortie

Madame, je suis Adam

ALLUSION

Description de l'exemple: Madame, je suis des espaces remove Adam, des virgules, apostrophes, ignorant la casse est MADAMIMADAM, il est un palindrome.

Algorithme d'analyse I:

Tout d'abord résoudre le problème, « ignorer la ponctuation, la sortie dans le jugement mais Yaoan comme il est »? Une méthode simple peut être utilisé: prétraitement. Construire une nouvelle chaîne qui ne contient pas la ponctuation originale et tous les caractères capitalisés (la façon de résoudre le problème de la capitalisation). Fonctions utilisées:

(1) le isalpha (c) est utilisée pour vérifier si la lettre c, si des lettres, des déclarations 1, 0 sinon.

(2) isdigit (c) c est utilisé pour vérifier si le numéro (0 à 9), si un nombre, le retour 1; 0 sinon.

(3) toupper (c) utilisé pour convertir en caractères majuscules c, c retours majuscules correspondant.

(4) tolower (c) c est utilisé pour convertir les caractères en minuscules, minuscule c retour correspondant.

 

Allons énumèrent le début et la fin de chaîne palindrome, puis déterminer si elle est vraiment une chaîne de palindrome.

int max = 0;

for (i = 0; i <m; i ++)

   for (j = i; j <m; j ++)

       if (s [i..j] 是 回文 串 && j-i + 1> max) = max j-i + 1;

variables max « maximale actuelle », qui stocke la longueur du palindrome trouvée jusqu'à présent la plus longue sous-chaîne. Si le train est i-ième caractère de la j-ième caractère (appelé s [i..j]) est une séquence palindromique, la longueur est vérifié si j-i + 1 est supérieure à la valeur max.

 

Procédé de détermination de la séquence palindromique si s [i..j] est la suivante:

ok = 1 int;

for (k = i; k <= j; k ++)

    si (s [k] = s [i + jk]!) ok = 0;

s [k] est la position "symétrique" s [i + jk], aussi longtemps que la comparaison échoue, l'indicateur doit être réglé à 0 la variable OK.

 

 

La dernière question: est sortie.

    Étant donné que la valeur maximale lorsqu'il est évalué, je ne sais pas s [i] et s [j] dans la position initiale de la chaîne dans buf. Par conséquent, il est nécessaire d'augmenter un tableau p, s, sauf [i] dans buf position en p [i]. Obtenu dans le pré-traitement, et ensuite mettre à jour le maximum tandis que le p [i] et p [j] et enregistrée dans x y, le buf final de sortie [x] pour tous les caractères buf [y] dans.

Inadéquat: Lorsque vous entrez dans une longue chaîne, facile à des heures supplémentaires, parce que l'énumération Palindrome début et la fin du cycle aussi.

 

 

Analyse II algorithme: énumération de la séquence palindromique de position « neutre » i, puis continuer à développer jusqu'à ce qu'il n'y a un caractère différent. Astuce: longueur impaire et même du traitement ne sont pas les mêmes.

 

Le dernier code AC:

<. bits / h stdc ++> #include 
#include <cstring>
 en utilisant l'  espace de noms std;
const  int maxn = 5005 ;
int dp [maxn] [maxn], HashTable [maxn];
int main () {
     bool pavillon;
    int i, j, L, basse, haute;
    chaîne s, st;
    tandis que (getline (cin, s)) { 
        st = "" ; 
        memset (table de hachage, 0 , sizeof (HashTable)); 
        memset (dp, 0 , sizeof (dp)); // 记得初始化
        pour(i = 0 ; i <s.size (); i ++ ) {
             si (isalpha (s [i])) { 
                st + = toupper (s [i]); 
                HashTable [i] = 1 ; // 表明是字符 
            } autre  si (isDigit (s [i])) { 
                st + = s [i]; 
                HashTable [i] = 1 ; 
            } 
        } 
        Pour (i = 0 ; i <st.size (); i ++) dp [i] [i] = 1 ; // 边界 
        faible = 0 ; 
        haute= 0 ;
        pour (L = 2 ; L <= st.size (); L ++ ) { 
            drapeau = true ;
            pour (i = 0 ; i + L- 1 <st.size (); i ++ ) { 
                j = i + L - 1 ;
                // 这里需要注意一下当L == 2时, dp [i + 1] [j-1] == 0 
                si (r [i] == r [j] && (dp [i + 1 ] [j- 1 ] == 1 || L == 2 )) { 
                    dp [i] [j] = 1 ;
                    si (drapeau) { //Une fois obtenu une séquence palindrome de longueur L est mis à jour 
                        bas = I; 
                        Haut = J; 
                        flag = false ; // notée par le temps L a été mis à jour 
                    } 
                } 
            } 
        } 
        pour (I = 0 , J = 0 ; I <S .Size () && J <Low; i ++) SI (Hashtable [I] == 1. ) J ++; // trouver le point de terminaison 
        du tout (I <s.size () && Hashtable [I] == 0 ) I ++; // retiré l'extrémité avant des autres personnages 
        pour (; I <s.size () && J <= haut; I ++ ) {
            le printf ( " % C " , S [I]);
             SI (HashTable [I] == 1. ) J ++; // comptage, pour arrêter le noeud final 
        } 
        printf ( " \ n- " ); 
    } 
    retourne  0 ; 
}

Résumé: à l'origine n'a pas vu TRUC, et trouvé plus tard, les mêmes idées et de leurs premières TRUC idées. Cette question, uniquement sur la base des « notes » de l'algorithme sur cette question a ajouté certaines conditions, donc une attention particulière lors de l'écriture des variables de code font mal!

Je suppose que tu aimes

Origine www.cnblogs.com/heyour/p/12499886.html
conseillé
Classement