LeetCode(6) 最長迴文字符串

題目:

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。算法

思路:

看到這道題目,首先想到迴文字符串,是一個沿正中字符串對稱的字符串,一個字符串若是時迴文字符串,去除兩端的字符串也必爲迴文字符串,由此設中間的字符串爲子狀態,應該能夠用動態規劃的方式求解。這裏設置儲存狀態的數組爲dpi,爲字符串(i~j)子串是否爲迴文字符串。編程思路以下:
image.png
具體代碼以下所示:
定義了一個paliInfo結構體,用於儲存最長子串的信息。相比起光放給出的算法刪除了對於j>i部分的循環。實際的運行結果中,也體現出了這一點,比起官方的節省了差很少一半的時間,和空間。
image.png
官方動態規劃運行結果
image.png
我的的動態規劃結果編程

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]
}
相關文章
相關標籤/搜索