回文子串
dp含义:表示区间内[i,j]是否有回文子串,有true,没有false。
递推公式:当s[i]和s[j]不相等,false;相等时,情况一,j-i<=1,说明要么"a"或者"aa"这两种情况;情况二:dp[i+1,j-1]是true,例如"cbabc"。
(这里图画错,j和i换个位置)
cs
public class Solution {
public int CountSubstrings(string s) {
bool[,] dp = new bool[s.Length,s.Length];
int result = 0;
for(int i=s.Length-1;i>=0;i--){
for(int j=i;j<s.Length;j++){
if(s[i] == s[j] && (j-i<=1 || dp[i+1,j-1])){
result++;
dp[i,j] = true;
}
}
}
return result;
}
}
最长回文子序列
dp含义:表示区间内[i,j]的回文子序列的长度dp[i,j]
cs
public class Solution {
public int LongestPalindromeSubseq(string s) {
int[,] dp = new int[s.Length,s.Length];
for(int i=0;i<s.Length;i++)dp[i,i] = 1;
for(int i=s.Length-1;i>=0;i--){
for(int j=i+1;j<s.Length;j++){
if(s[i] == s[j]){
dp[i,j] = dp[i+1,j-1]+2;
}else{
dp[i,j] = Math.Max(dp[i,j-1],dp[i+1,j]);
}
}
}
return dp[0,s.Length-1];
}
}