- 题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
- 输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000。
- 输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。
- 示例一:
- 输入:
- abcda
- google
- 输出:
- 2
- 2
- 思路:
- 构建两个字符数组,分别存放 正序 和 倒序。
- 构建n*n的dp数组。
- 两重循环计算每一行或每一列能构成的最大公共子序列。如 第四行i=4, 第二列j=2,go在elgo上的最大公共子序列为2
- 代码:
import java.util.Scanner;
//构造回文
public class Main{
public static void mian(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
String str = scan.nextLine();
System.out.println(str.length()-getResult(str));
}
}
public static int getResult(String str) {
StringBuilder sb = new StringBuilder(str);
String newStr = sb.reverse().toString();
//构建两个字符数组,分别存放 正序 和 倒序
char[] c1 = str.toCharArray();
char[] c2 = newStr .toCharArray();
//动态规划数组
int n = str.length();
int[][] dp = new int[n+1][n+1];
//计算最大回文串
for(int i=1; i < n+1; i++) {
for(int j=1; j<n+1; j++) {
//如果相等,说明最大公共子序列+1。
if(c1[i-1] == c2[j-1]) {
dp[i][j] = Math.max(Math.max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]+1);
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[n][n];
}
}