思路:這個思路其實就是中心開花,我們迴圈遍歷每乙個節點,以這個節點為回文子串的最中間節點,然後對該節點呼叫乙個尋求子串長度的方法:比較中心節點兩邊的節點是否相等,相等則繼續向兩邊擴充套件,直到不相等 或者某一端到頭。
例如字串:acabacb 我們假設現在遍歷到第四個節點b,對他呼叫尋求回文子串長度的方法,就會對比 3 5位置的元素是否相等 如果相等則aba是乙個回文串 然後i-2 和i+2位置繼續判斷 最後得到回文子字串長度返回 ,在主迴圈中新增兩個變數start end 用來標記最長子串的長度 如果新獲取的值更大 則更新。
其實我們忽略了 一種情況:最壞情況有兩種 :1最長子回文串長度為一 中心節點兩端不相同
2最長回文子串長度為2 中心節點由兩個相同的節點組成:例如acabbacb 中心節點是ab;
所以對於兩種情況均呼叫尋求子串長度的方法,保留返回值較大值
public class solution
int start = 0, end = 0;
int len1=0, len2=0,len=0;
for (int i = 0; i < s.length(); i++)
}return s.substring(start,end+1);//substring含頭不含尾
}public int expandaroundcenter(string s, int left, int right)
//因為迴圈的原因 現在的lr是最後一次跳出迴圈時的值
return r-l-1;}}
測試類
public class test
}
上面是題解思路,其實還有一種思路:學習動態規劃的時候我們應該做過求兩個字串最長公共子串行長度的題,
我們如果把乙個字串反轉(reverse)一下,然後把反轉後的字串和反轉前的字串求最長公共子串行,我們會發現得到的公共子串行其實就是最長回文子串。
最長回文子串 最長回文子串行
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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...