1. 程式人生 > >動態規劃——構造迴文——騰訊2017暑期實習生程式設計題

動態規劃——構造迴文——騰訊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];
	}
}