給定一個字符串 s
,找到 s
中最長的迴文子串。你能夠假設 s
的最大長度爲 1000。算法
看到這道題目,首先想到迴文字符串,是一個沿正中字符串對稱的字符串,一個字符串若是時迴文字符串,去除兩端的字符串也必爲迴文字符串,由此設中間的字符串爲子狀態,應該能夠用動態規劃的方式求解。這裏設置儲存狀態的數組爲dpi,爲字符串(i~j)子串是否爲迴文字符串。編程思路以下:
具體代碼以下所示:
定義了一個paliInfo結構體,用於儲存最長子串的信息。相比起光放給出的算法刪除了對於j>i部分的循環。實際的運行結果中,也體現出了這一點,比起官方的節省了差很少一半的時間,和空間。官方動態規劃運行結果
我的的動態規劃結果
編程
type paliInfo struct { size int start int end int } func longestPalindrome(s string) string{ //1.設定數組保存迴文字符串信息 n := len(s) dp := make([][]bool,n) for k := 0;k<n;k++{ dp[k] = make ([]bool,n) } var ans paliInfo //2.若是一個字符串中i~j爲迴文字符串,則(i+1)~(j-1)爲迴文字符串 //3.第一個字符和第二個字符的迴文字符串不能夠用此判斷,設置初始值 for i:=0;i<n;i++{ dp[i][i] = true } ans.size = 1 ans.start = 0 ans.end = 0 for i := 0;i<n;i++{ for j := i-1;j>=0;j--{ if i-j == 1{ if s[i] == s[j]{ dp[j][i] = true if i-j+1>ans.size{ ans.start = j ans.end = i ans.size =i-j+1 } } else { dp[j][i]=false } } if i-j >1{ if dp[j+1][i-1]&&s[i]==s[j]{ dp[j][i]=true if i-j+1>ans.size{ ans.start = j ans.end = i ans.size =i-j+1 } }else { dp[j][i]=false } } } } return s[ans.start:ans.end+1] }