最大の回文部分文字列(句読点やスペースを無視して)

コード

1  // 最小回文ストリング、無視句読点およびスペース
2の#include <stdio.hの>
 3の#include < 文字列・H>
 4の#include <のctype.h>
 5  の#define MAXN 5000 + 10
 。6  
。7  チャーBUF [MAXN] 、S [MAXN];
 8  INT P [MAXN];
 9  int型のmain()
 10  {
 11      INT N-、M = 0 12である      関数fgets(BUF、はsizeof (S)、標準入力);
 13である      N- = STRLEN(BUF)
 14      以下のためのint型 I = 0 ; I <N-; I ++ 15      {
 16          IF (はisalpha(BUF [I]))
 17。         {
 18は              P [M] = I;
 19              S [M ++] = TOUPPER(BUF [I]);
 20          }
 21れる     }
 22である      のprintf(" %S \ N- " 、S)、
 23は     
24      のint =最大0、X = 0、Y = 0 ;
 25      
26である 
27      // なしの最適化
28      / * (I = 0のため、I <M、I ++)//このアプローチは三重を必要別の方法あればサイクルは、次の参照
 29      {
 30の 
31 IS         用(INT J = I; J <Mであり、j ++)
 32          {
 33              のint OK = 1、K。
34              (; K <=(JI)/ 2 K ++、K = 0)のための
 35              {
 36                  IF(!S [I + K] = S [JK])
 37                  {
 38                      OK = 0。
39                      ブレーク;
40                  }
 41              }
 42              であれば(OK && J-I + 1> max)の
 43              {
 44                  、最大= J-I + 1。
45                  X = P [i]は、
46                  、Y = P [J]。
47              }
 48         }
 49      } * / 
50  
51である     // 最適化方法
52である     ため(私は= 0 ; I <M、I ++)    // iは中心にあるこのだけ拡張検出器2環状方法両側に、しかし2点パリティサイクル
53は、     {
 54れる         INT ; K
 55          (K = 0 ; IK> = 0 && I + K <M、K ++)// パリンドローム配列が奇数であり、S [i]の中間体パリンドローム配列のための
56          {
 57              IF(!S [IK] = S [K + I])BREAK ;         // IF(!S [IK] = S [K + I])
 58                                               // { 
59              IF2 * K + 1。> MAX)                     //         もし(2 *(K-1)+1> max)の
60              {                                 //         { 
61                  、最大= 2 * K + 1//             最大= 2 *(K-1)+1。
62                  X = P [IK]。                    //             X = P [1-(K-1)]。
63                  、Y = P [I + K]。                    //             Y = P [I +(K-1)]。
64              }                                 //         }
 65                                               //         ブレーク。
66                                               //}このようなループが最初IKについて決定されるので、最大パリンドローム配列は、最初または最後に表示されるブロックに書き込まれた文章、<0又はK + I> M、場合
67          }                                     //      直接終了の原因循環ループは、入力することはできませんIF(2 *(K-1 )+1> max)のステートメントブロック、そうマックス、X、Yの更新が失敗したことを、誤差
68          
69          のために(K = 0 ; IK> = 0 && I + K + 1 <M、K ++)/ / パリンドローム配列が偶数であり、S [i]は中央左パリンドローム配列のための
70          {
 71で             IF(S [IK] S = [I + K +!1。 ])BREAK ;         // IF(S [IK]! S = [I + K + 1])
 72                                                 // { 
73は             IF2 * K + 2 > MAX)                       //        IF(2 *(K-1)+2>最大)
74              {                                 //         { 
75                  、最大= 2 * K + 2 ;                      //             最大= 2 *(K-1)+2; 
76                  X = P [IK];                     / /             X = P [I-(1-K)]; 
77                  、Y = P [I + K + 1 ];                     //             Y = P [I +(1-K)+ +1]; 
78              }                                   //         }
 79                                                 //         BREAK ;
 80                                                 // 同じ理由}間違っています。
81         }
 82      }
 83  
84  
85  
86      のprintf(" 最も長いパリンドロームストリング(文字長のみ):%D \ N- " 、MAX);
 87      (; I <= Y; I = X I ++ )のputchar(BUF [I ]);
 88      のputchar(' \ N- ' );
 89      リターン 0 ;
 90 }

 

 

おすすめ

転載: www.cnblogs.com/bboykaku/p/12629867.html