題目描述:
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
方法一:中心擴充套件演算法
1.回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n - 1個這樣的中心。原因在於所含字母數為偶數的回文的中心可以處於兩字母之間。
2.將每個中心擴充套件,選出長度最長的子串
class
solution
}return s.
substring
(start,end);}
public
intfunc
(string s,
int i,
int j)
return j-i-1;
}}
方法二:暴力解法
1.遍歷每個子串,判斷是否是回文子串
2.計算回文子串的長度,選出最長子串
class
longestpalindrome1
}return
true;}
public string longestpalindrome
(string s)
}return ans;
}
方法三:動態規劃
1.整體思想就是,申請乙個二維的陣列初始化為 0,然後判斷對應的字元是否相等,相等的話arr [ i ][ j ] = arr [ i - 1 ][ j - 1] + 1
2.當 i = 0 或者 j = 0 的時候單獨分析,字元相等的話 arr [ i ][ j ] 就賦為 1 。arr [ i ][ j ] 儲存的就是公共子串的長度。
3.當 s 的其他部分中存在非回文子串的反向副本時,最長公共子串法就會失敗。為了糾正這一點,每當我們找到最長的公共子串的候選項時,都需要檢查子串的索引是否與反向子串的原始索引相同。如果相同,那麼我們嘗試更新目前為止找到的最長回文子串;如果不是,我們就跳過這個候選項並繼續尋找下乙個候選。
class
solution
string r=
newstringbuffer
(s).
reverse()
.tostring()
;int len=s.
length()
;int
arr=
newint
[len]
;int max=0;
int end=0;
for(
int i=
0;i)else
}else
if(arr[j]
>max)}}
}return s.
substring
(end-max+
1,end+1)
;}}
方法四:manacher 演算法(了解思想)
1.首先在字串的首尾、相鄰的字元中插入分隔符,例如 「babad」 新增分隔符 「#」 以後得到 「#b#a#b#a#d#」
2.輔助陣列 p 記錄了新字串中以每個字元為中心的回文子串的資訊。手動的計算方法仍然是「中心擴散法」,此時記錄以當前字元為中心,向左右兩邊同時擴散,記錄能夠擴散的最大步數。
3。輔助陣列 p 的最大值就是「最長回文子串」的長度。
最長回文子串 最長回文子串行
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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...