100日計画の3日目の最長の回文部分文字列

学習目標:

私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!

歴口質問銀行質問5公式リンク


学習コンテンツ:

最長の回文部分文字列

给你一个字符串 s,找到 s 中最长的回文子串。

例1:

入力:s = "babad"
出力: "bab"
説明: "aba"も、質問の意味を満たす答えです。
例2:

入力:s = "cbbd"
出力: "bb"
例3:

入力:s = "a"
出力: "a"
例4:

入力:s = "ac"
出力: "a"

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

ソース:LeetCode

勉強の時間:

2022.1.9


学習出力:

アイデア1
ここに画像の説明を挿入

実行に時間がかかるのはなぜですか?
呼び出したメソッドが多すぎるため、時間計算量が非常に高くなります。主な関数はO(n2)であり、回文かどうかの判断は関数内のO(n)です。

問題解決のアイデア

1.これはDay2のベースアドレスメソッドに似ています。ベースアドレスを定義し、このベースアドレスから逆方向に検索して、最長のパリンドローム文字列を見つけ
ます。2.では、どのように見つけるのでしょうか。最初にベースアドレスを決定し、次にforループを開始し、後ろから前に検索して、同じベースアドレスを持つ文字を見つけます。次に、ベースアドレスが開始、見つかった文字のアドレスが終了、長さがend-start + 1文字列は回文のように見えます
3。それが回文であるかどうかをどのように判断しますか?回文かどうかを判断する関数を記述します。アイデアは、start +iをend-iと比較することです。iは0から長さ/2までです。不一致がある場合は、そうではなく、falseを直接返します
。4。次に、ベースアドレスの回文から開始する最長値を取得できます。 。次に、ベースアドレスを元に戻し、プロセス
5を続行します。この方法の時間計算量は比較的高く、暴力における洗練された問題解決のアイデアと見なされます。後で最適化し
ます。純粋に暴力的な問題解決、つまり、各サブストリングがパリンドロームであるかどうかを判断するという点では、私の方法ははるかにエレガントです。純粋な暴力が使用されている場合、

public class Solution {
    
    
    public string LongestPalindrome(string s) {
    
    
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
    
    
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
    
    
                if(s[i]==s[j]){
    
    
                    isFind=true;
                    if(IsPalindrome(s,i,j)){
    
     //子串是不是是回文串
                         if(j-i+1>maxlength){
    
    
                             maxlength=j-i+1;
                             maxstring=s.Substring(i,maxlength);
                         }
                    }
                }
            }
            
            if(!isFind){
    
      //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
    
    
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    
    bool IsPalindrome(string s,int start,int end){
    
    
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
    
    
            if(s[start+i]!=s[end-i]){
    
     //不对称
                return false;
            }
        }
        return true;
    }
}

アイデア2
ここに画像の説明を挿入

問題解決のアイデア
1.最適化後、不要なトラバーサルが大量に破棄されるため、実行時間が900から約150に短縮されます
。2。実際、アイデア1のステップ2が最適化されています。ベースアドレスを選択した後、次に後ろから前に同じ文字を探す場合、ベースアドレスまでの文字の長さが現在の最大長より短い場合は、最大長を探しているので判断する必要はありません。

public class Solution {
    
    
    public string LongestPalindrome(string s) {
    
    
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
    
    
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
    
    
                if(s[i]==s[j]){
    
    
                    isFind=true;
                    if(j-i+1>maxlength){
    
    
                        if(IsPalindrome(s,i,j)){
    
     //子串是不是是回文串
                            maxlength=j-i+1;
                            maxstring=s.Substring(i,maxlength);
                         }
                    }else{
    
    
                        break;
                    }
                }
            }

            if(!isFind){
    
      //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
    
    
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    bool IsPalindrome(string s,int start,int end){
    
    
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
    
    
            if(s[start+i]!=s[end-i]){
    
     //不对称
                return false;
            }
        }
        return true;
    }
}

著者:モルモットXiaohuihui
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。

おすすめ

転載: blog.csdn.net/m0_48781656/article/details/122394687
おすすめ