動態規劃——構造迴文——騰訊2017暑期實習生程式設計題
阿新 • • 發佈:2018-11-16
- 題目:給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?
輸出需要刪除的字元個數。 - 輸入描述:輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000。
- 輸出描述:對於每組資料,輸出一個整數,代表最少需要刪除的字元個數。
- 示例一:
- 輸入:
- abcda
- google
- 輸出:
- 2
- 2
- 思路:
- 構建兩個字元陣列,分別存放 正序 和 倒序。
- 構建n*n的dp陣列。
- 兩重迴圈計算每一行或每一列能構成的最大公共子序列。如 第四行i=4, 第二列j=2,go在elgo上的最大公共子序列為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]; } }