2
动态规划的解法
以adbca为例子
状态数组dp[i][j]表示从 i~j最大的回文串长度
状态转移方程为
初始状态数组
a\d\b\c\a
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | ||||
2 | 0 | 1 | |||
3 | 0 | 0 | 1 | ||
4 | 0 | 0 | 0 | 1 | |
5 | 0 | 0 | 0 | 0 | 1 |
第一次遍历 len = 2时 状态数组
ad\db\bc\ca
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | 1 | |||
2 | 0 | 1 | 1 | ||
3 | 0 | 0 | 1 | 1 | |
4 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 1 |
第三次遍历 len = 3
adb\dbc\bca
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | ||
2 | 0 | 1 | 1 | 1 | |
3 | 0 | 0 | 1 | 1 | 1 |
4 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 1 |
第四次遍历 len = 4
adbc\dbca
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | |
2 | 0 | 1 | 1 | 1 | 1 |
3 | 0 | 0 | 1 | 1 | 1 |
4 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 1 |
第五次遍历 len = 5
adbca
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 3 |
2 | 0 | 1 | 1 | 1 | 1 |
3 | 0 | 0 | 1 | 1 | 1 |
4 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 1 |
代码
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
char[] array = sc.next().toCharArray();
//字符串长度
int N = array.length;
int[][] dp = new int[N][N];
//状态数组
for(int i = 0; i < N;dp[i][i] = 1,i++){}
for(int len = 2; len <= N;len++ ){
for(int i = 0; i + len <= N;i++){
if(array[i] == array[i+len-1]){
dp[i][i+len-1] = dp[i+1][i+len-2]+2;
}
dp[i][i+len-1] = Math.max(dp[i][i+len-1],Math.max(dp[i][i+len-2],dp[i+1][i+len-1]));
}
}
System.out.println(dp[0][N-1]);
思考
该问题具有最优子结构问题,从i - j 的最长回文串等于 i+1~j-1的最长回文串+2 或 i+1~j 或 i~j-1的最长回文串
只要知道了状态转移的规律,就可以很容易写出代码
网友评论