[编程题] 构造回文

给定一个字符串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 }

 


posted @ 2016-10-17 16:39  虫儿ls  Views(1230)  Comments(0Edit  收藏  举报