(java实现)
题目描述:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
示例1:
输入
abcda
输出
2
2
问题分析:
需要寻找最大回文串,故考虑使用动态规划来实现。
提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变。
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度即可得到要删除的字符数。
相关知识:
参考代码:
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
while (input.hasNext())
{
String str1 = input.nextLine();
String str2 = new StringBuilder(str1).reverse().toString();
int len = str1.length();
int[][] dp = new int[len+1][len+1];
for (int i=1; i<=len; i++)
{
for (int j=1; j<=len; j++)
{
if (str1.charAt(i-1) == str2.charAt(j-1))
{
dp[i][j] = dp[i-1][j-1]+1;
}else
{
dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
}
}
}
System.out.println(len-dp[len][len]);
}
}
}