leetcode647 回文子串

2021-09-23 22:10:51 字數 1501 閱讀 2206

參考:

回文串特點:以中間的乙個(奇數個)或者兩個(偶數個)字母為中心是對稱的

1.動態規劃

dp[i][j]表示i—j之間的序列是否是回文串,如果是為true否則為false,那麼遞推公式為:

(1)如果s[i] != s[j]那麼就不是回文串

(2)如果s[i] == s[j]那麼dp[i][j] = dp[i+1][j-1]

公式含義為:如果i+1到j-1的序列是回文串,且s[i] == s[j]那麼說明i到j也是回文串,如果i+1到j-1不是回文串,那麼i到j也不是回文串

上述公式要成立需要滿足:i+12

那麼考慮j-i<=2的情況:

1.j-i=0,即j=i,即乙個字母本身他就是回文串

2.j-i=1,即i,j相鄰,且兩個字母相等s[i]=s[j],那麼也是回文串

3.j-i=2,即j和i之間有乙個字母,且s[i]=s[j],那麼也是回文串,如aba

**:

class solution 

}return res;}}

;

**中

dp[i]

[j]=

(s[i]

== s[j])&&

(j - i <=

2|| dp[i +1]

[j -1]

);

可以寫成

if

(s[i]

!= s[j]

) dp[i]

[j]= false;

else

if(s[i]

==s[j]

&& j-i<=2)

dp[i]

[j]= true;

else

dp[i]

[j]= dp[i+1]

[j-1

];

下面看一下迴圈變數:

j-i<=2的情況每個位置不需要依賴其他位置就可以決定自己的值

對於其他位置,由遞推公式可以看出乙個位置的值是由其左下角的值決定的

2.回文中心

將每個字母分別作為回文中心然後向兩邊擴充套件,分兩種情況,一種是自己為中心,第二種自己和下乙個一起為中心

class solution 

mid1 = i, mid2 = i+1;

//偶數

while

(mid1 >=

0&& mid2 < len && s[mid1]

== s[mid2])}

return res;}}

;

3,馬拉車演算法沒看

leetcode647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 輸入 aaaba 輸出 9 解釋 a aa a aa aaa a b aba a 奇回文 如 aba 和偶回文 如abba 歸一化處理 i 0123 47s...

leetcode 647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 注意 輸入...

LeetCode 647 回文子串

題目鏈結 題目描述 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例輸入 abc 輸出 3 解釋 三個回文子串 a b c 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 注意 ...