leetcode毎日ブラシタイトルプラン--day59

テンキー5回文構造最長部分文字列

Manacherアルゴリズムは、この問題を解決するために設計されています

説明:

  1、温度:新しい文字列#のすべての文字の前に挿入されたが、最も注目最も頭と尾はまた、挿入されているので、奇数位置にあるすべてのオリジナルキャラクター

  2、maxcenter:最大中心位置を既知のパリンドローム配列

  3、maxend:最大の回文文字列に覆われた尾のインデックス番号

  私はその後、決定され、彼は内部に含まれるパリンドローム配列であれば、文字列の対応する部分は、パリンドロームを持っている場合は文字の前に近いものを、彼は、対応する、それぞれのです4、これは、パリンドロームの一部であり、彼の

  図5は、ミラーの半分を超えて、不確実でない場合には、限定するもので、下限が分( - 同じ、ミラー半径点境界)です。

leetcode注(文字列スタックオーバーフロー)のいくつかの場所:

  1、#挿入すると新しい文字列、使用の一back回避のスタックオーバーフロー(他の可能な干渉をするがある場合は近くの空のように、デフォルトの割り当ては十分ではありません)

  判断が戻って一時は2、

  最後に戻りSUBSTR、s.substr(開始、LEN)で返さ、第2の長さが取られている3、

クラスのソリューション{
 パブリック文字列 longestPalindrome(文字列S){
         場合(S == "" のリターン "" ;
        文字列の TEMP = " " 以下のためにint型私は= 0 ; I <s.lengthを(); I ++ 
        {
            // 一時[2 * I + 1] = S [i]は、
            // 一時[2 * I + 2] = '#'; 
            temp.push_back(S [I])。
            temp.push_back(' ' );
        }
        INTの REC [ 3000 ]。
        memset(REC、0はsizeof (REC))。
        int型 maxend = 0、maxcenter = 0 ;
        以下のためにINT iが= 0 ; I < 2 * s.length()+ 1 ; I ++ 
        {
            もし(maxend> ⅰ)
            {
                REC [I] =分(REC [ 2 * maxcenter-i]は、maxend- I)。
            }
            一方(I-REC [I]> 0 && I + REC [I] < 2 * s.length()+ 1 - 1 && TEMP [i]は[I-REC - 1 ] == TEMP [I + REC [I ] + 1 ])
                REC [I] ++ ;
            もし(REC [I]> REC [maxcenter])
            {
                maxend = I + REC [I]。
                maxcenter = I;
            }
        }
        INT lenは、開始;
        もし(TEMP [maxcenter] == ' ' 
            {
                もし(TEMP [maxend] == ' ' 
                    {
                        開始 = maxcenter-maxend / 2 
                        よう = maxend- maxcenter。
                    }
                
                    {
                        開始 = maxcenter-(maxend + 1)/ 2 
                        よう = maxend-maxcenter + 1 
                    }
            }
        
        {
            もし(TEMP [maxend] == ' ' 
                {
                    開始 = maxcenter-maxend / 2 =(maxend-maxcenter)/ 2 * 2 + 1 
                }
            
                {
                    開始 = maxcenter-(maxend + 1)/ 2 
                    よう = maxend- maxcenter。
                }
        }
        リターンs.substr(開始、LEN);
    }
}。
コードの表示

 追加は、それがその後、析出し、最終的にグラムに戻り、文字列gの正面にある場合、これはオーバーフロー、ない意味がない、それを試してみました。それはより多くのメモリを占有します。(文字が、文字は確かにオーストリア.pushbackを推奨されていませんが、確かにオーバーフロー直接割り当てをしようとしませんでした)

クラスのソリューション{
 パブリック文字列 longestPalindrome(文字列S){
         場合(S == "" のリターン "" ;
        文字列の TEMP = " " 以下のためにint型私は= 0 ; I <s.lengthを(); I ++ 
        {
            temp.push_back(S [I])。
            temp.push_back(' ' );
        }
        INTの REC [ 3000 ]。
        memset(REC、0はsizeof (REC))。
        int型 maxend = 0、maxcenter = 0 ;
        以下のためにINT iが= 0 ; I < 2 * s.length()+ 1 ; I ++ 
        {
            もし(maxend> ⅰ)
            {
                REC [I] =分(REC [ 2 * maxcenter-i]は、maxend- I)。
            }
            一方(I-REC [I]> 0 && I + REC [I] < 2 * s.length()+ 1 - 1 && TEMP [i]は[I-REC - 1 ] == TEMP [I + REC [I ] + 1 ])
                REC [I] ++ ;
            もし(REC [I]> REC [maxcenter])
            {
                maxend = I + REC [I]。
                maxcenter = I;
            }
        }
        INT lenは、開始;
        文字列グラム。
        もし(TEMP [maxcenter] == ' ' 
            {
                もし(TEMP [maxend] == ' ' 
                    G = s.substr(maxcenter-maxend / 2、maxend- maxcenter)。
                
                    G = s.substr(maxcenter-(maxend + 1)/ 2、maxend-maxcenter + 1 )。
            }
        
        {
            もし(TEMP [maxend] == ' ' 
                G = s.substr(maxcenter-maxend / 2、(maxend-maxcenter)/ 2 * 2 + 1 )。
            
                G = s.substr(maxcenter-(maxend + 1)/ 2、maxend- maxcenter)。
        }
        リターングラム。
    }
}。
大容量メモリフットプリント、意味無し

 

おすすめ

転載: www.cnblogs.com/tingxilin/p/11925237.html