学習目標:
私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!
!!!
歴口質問銀行質問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
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。