动态规划——构造回文——腾讯2017暑期实习生编程题

  1. 题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
    输出需要删除的字符个数。
  2. 输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000。
  3. 输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。
  4. 示例一:
- 输入:
	- abcda
	- google
- 输出:
	- 2
	- 2
  1. 思路:
    1. 构建两个字符数组,分别存放 正序 和 倒序。
    2. 构建n*n的dp数组。
    3. 两重循环计算每一行或每一列能构成的最大公共子序列。如 第四行i=4, 第二列j=2,go在elgo上的最大公共子序列为2
  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];
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_37378399/article/details/83865322
今日推荐