回文配列回文配列回文パーティショニングIIビスを分割[LeetCode]回文リンクリストパリンドロームリスト回文数パリンドロームデジタル認証検証検証回文回文パーティションパリンドローム文字列の分割

それは回文である場合は、単独リンクリストを考えると、決定します。フォローアップ:あなたはO(n)の時間とO(1)スペースでそれを行うだろうか?

この質問は、リストは回文リストであるかどうかを決定することができます6弦の合計で回文についてLeetCodeの質問、この道、他の5つの道路に加えて、回文数検証回文数 検証は回文検証文字列を回文 回文パーティション分割回文配列回文パーティショニングは、2つのIIの回文配列に分割 し、最長の回文構造サブストリング最長の回文配列を直接アクセスすることはできません座標上の場所より。困難な文字列のリストを、だけで、最初からトラバースします場所。だから、特性に応じた文字列を回文、我々は、我々は最初のリストの中間点を見つける必要があり、このポインタは2つの方法を使用して、速度を達成するために使用することができ、対応する位置の値が等しい比較する必要がある前に見つけることができますバイナリ検索に変換分類されたリストツリーは、バイナリ検索ツリーにリンクリストをソートされます と、リストは、リストを並べ替える並べ替え、我々はポインタの速度の中間点を見つけるために使用する原則は、各ポインタが速く2つのステップを行くために、高速と低速の二つのポインタで、低速のポインタはさらに一歩進んで、非常に高速ポインタを完了したときに、ポインタの位置は遅い中間点です。私たちは、スタックに格納された値を考えて、スタックポインタ各スローステップを使用する必要があり、そのリストの最初の半分が原因LIFOスタックの性質のために、スタックに格納され、中間点に到達し、それが可能対応するパリンドローム配列に基づいて、リストの比較の半分の後。コードは以下の通りであります:  

 

解決策1:

コードをコピー
クラスのソリューション{
 パブリックBOOL isPalindrome(ListNode * ヘッド){ (ヘッド||頭部>次の!)であれば返すListNode *遅い=頭部、*速い= ヘッド。スタック< 整数> 秒; s.push(頭部> val)で、一方、(急速>次に&&急速>ネクスト> 次){遅く=遅い> 次。速い=急速>ネクスト> 次; s.push(スロー> ヴァル)} (!急速>もし次)s.pop(); (スロー>ながら次){遅い=遅い> 次。INT TMP = s.top()。s.pop(); (!TMP =スロー> val)であれば返します} を返す
コードをコピー

 

この質問は、それは、そのLIFO特性を使用することで、我々は、スタックの目的で、その後、スタックを使用する代わりに、アクションの場合は、それをスタックすることはできません良い後方を言っているのは、(1)スペースOを使用してみましょうフォローアップです抽出要素の前半。だから今、私たちはそれの要素を取るためにどのように逆方向に、積み重ねないでください。リストの後半の中間点は、それを反転した後、私たちは、注文回文を比較できるように、次のコードを参照してください、見つけることができます:

 

対処方法2:

コードをコピー
クラスのソリューション{
 パブリックBOOL isPalindrome(ListNode * ヘッド){ (ヘッド||頭部>次の!)であれば返すListNode *遅い=頭部、*速い= ヘッド。一方、(急速>次に&&急速>ネクスト> 次){遅く=遅い> 次。速い=急速>ネクスト> 次; } ListNode *最後=遅い>次に、*事前= ヘッド。一方、(直前に入って> 次){ListNode * TMP =直前に入って> 次。直前に入って>次= tmp-> 次。tmp->次=遅い> 次。スロー>次= TMP。} (スロー>ながら次){遅い=遅い> 次。もし(前>ヴァル!=スロー> valが) を返すプリ=前>次; } を返す}}。
コードをコピー

おすすめ

転載: www.cnblogs.com/strugglerisnd/p/10988111.html