[编程题] 构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda google
输出例子:
2 2
思想:回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。
1 package fromniuke; 2 3 import java.util.Scanner; 4 5 public class Test28 { 6 7 public static void main(String[] args){ 8 Scanner scan = new Scanner(System.in); 9 while(scan.hasNext()){ 10 String str = scan.nextLine(); 11 System.out.println(str.length()-getResult(str)); 12 } 13 } 14 public static int getResult(String str){ 15 StringBuilder sb = new StringBuilder(str); 16 String newStr = sb.reverse().toString(); 17 char[] c1 = str.toCharArray(); 18 char[] c2 = newStr.toCharArray(); 19 int n = str.length(); 20 int[][] dp = new int[n+1][n+1]; 21 for(int i=1;i<n+1;i++){ 22 for(int j=1;j<n+1;j++){ 23 if(c1[i-1]==c2[j-1]){ //此处应该减1. 24 dp[i][j]=Math.max(Math.max(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]+1); 25 }else{ 26 dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]); 27 } 28 } 29 } 30 return dp[n][n]; 31 } 32 }
Jumping from failure to failure with undiminished enthusiasm is the big secret to success.