最長回文子串

2021-10-03 01:51:03 字數 1641 閱讀 9678

題目描述:

給定乙個字串 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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...