最長回文子串 c

2021-10-06 20:49:34 字數 1097 閱讀 3547

將字串 s 反轉得到字串 rev,再求他們的最長公共子串,再判斷該最長公共子串是否就是我們要找的最長回文子串。

class solution 

}else break;

}temp="";

}return res;

}};

注:該方法雖然比暴力法高效,但是在查詢最長公共子串的部分效率還是不夠高,所以在力扣中最後乙個測試用例會超出時間限制。

思路:對於這道題,我們需要判斷多個子串是否是回文子串,在判斷的過程中會有重複的字串判斷,所以為了,減少判斷時間複雜度,我們從暴力遞迴,改造成動態規劃的形態。

首先我們定義乙個二維陣列dp,行和列分別代表字串s每個字元的下標,例如dp[j][i] 代表從下標為j到i之間的子串,是否為回文子串,如果是記錄下為true,否則為false,

這樣就可以把之前判斷過的記錄下來,當判斷dp[j-1][i+1]的時候,當s[j-1]=s[i+1]時,我們只需要判斷dp[j][i]是否為回文子串即可,因為dp[j][i]之前已經判斷過,所以不用再進入j到i這個範圍內判斷j到i是否是回文子串。

我們再用本題中的例子具體演示一下,方便理解:

當i=1, j=0時,s[j]=b,s[i]=a,所以dp[0][1]=false;

當i=2,j=0時,s[j]=b,s[i]=b,這時候我們要判斷s[0+1]=s[2-1]?顯然相等,所以dp[j][i]=true;

當i=3,j=0時,s[j]=b,s[i]=a,不相等,j++,s[1]=a=s[3],同理此時判斷s[1+1]=s[3-1]?顯然相等。

總之就是讓列表示的下標走在前面,然後用行表示的下標,判斷列之前的每一字元的位置到它之間是否回文,其中判斷的過程一定會有重複的判斷,而這些重複的也一定是在之前的迴圈過程中被判斷過,所以不用再進入子串的子串中進行判斷。

class solution 

vector>res (length,vector(length,0));

//先初始化二維陣列(對角線)

for(int i=0;imaxlength)}}

}return s.substr(start,maxlength);

}

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...