647. 迴文子串
題目連結:647. 迴文子串
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰迴文子串
日期:2024-10-19
想法:本題精髓在於dp[i][j]表示的是s[i,j]這個子字串是不是迴文的,是Boolean型別,s[i]s[j]不等時,肯定不迴文;s[i]s[j]相等時,開始看ij的大小,ij大小相等那麼表示單個字元的情況,迴文,大小差距為1,表示的是像“aa”這種情況,迴文;大小差距大於1了,就得看這兩個字元中間的子串是不是迴文的了即看dp[i + 1][j - 1]是不是為true;初始化當然起始全部都是false;遍歷順序還有要注意由於有dp[i + 1][j - 1],所以列得從下往上走,行還是繼續從左往右就行了。
Java程式碼如下:
class Solution {
public int countSubstrings(String s) {
char[] chars = s.toCharArray();
int res = 0;
int len = chars.length;
boolean[][] dp = new boolean[len][len];
for(int i = len - 1; i >= 0; i--) {
for(int j = i; j < len; j++) {
if(chars[i] == chars[j]) {
if(j - i <= 1) {
dp[i][j] = true;
res++;
}else if(dp[i + 1][j - 1]){
dp[i][j] = true;
res++;
}
}
}
}
return res;
}
}
516.最長迴文子序列
題目連結:516.最長迴文子序列
文件講解︰[程式碼隨想錄(programmercarl.com)](https://programmercarl.com/0516.最長迴文子序列.html)
影片講解︰最長迴文子序列
日期:2024-10-19
想法:dp[i][j]表示s區間[i,j]中得最長子序列長度,跟上面字串是不一樣的;s[i]s[j]相等,原長度dp[i + 1][j - 1]加2,不相等,就看是不要前一個長還是不要後一個長,即dp[i + 1][j]dp[i][j - 1];初始化顯然dp[i][i]區間只有一個字元時長度為1;遍歷順序跟上面一樣。
Java程式碼如下:
class Solution {
public int longestPalindromeSubseq(String s) {
char[] chars = s.toCharArray();
int len = chars.length;
int[][] dp = new int[len][len];
for(int i = 0; i < len; i++) {
dp[i][i] = 1;
}
for(int i = len - 1; i >= 0; i--) {
for(int j = i + 1; j < len; j++) {
if(chars[i] == chars[j]) {
dp[i][j] = dp[i + 1][j - 1] + 2;
}else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][len - 1];
}
}