1. 程式人生 > >筆試題(一) 構造迴文字串

筆試題(一) 構造迴文字串

    並沒有筆試,從網上看到這個問題,想了很久,通過參開別人的部落格才看懂.記錄一下

    題目:

    給定一個字串s,你可以從中刪除一些字元,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?

    輸出需要刪除的字元個數

    輸入描述:

    輸入資料有多組,每組包含一個字串s,且保證:1<=s.length<=1000.

    輸出描述:

    對於每組資料,輸出一個整數,代表最少需要刪除的字元個數。

    輸入例子:

    abcda
    google

    輸出例子:

    2
    2

通過參考這篇博文才搞懂:http://blog.csdn.net/u012150590/article/details/51474731\

原理
動態規劃方法解LCS問題的原理如下:
考慮最長公共子序列問題如何分解成子問題,設A=“a0,a1,…,am-1”,B=“b0,b1,…,bn-1”,並Z=“z0,z1,…,zk-1”為它們的最長公共子序列。不難證明有以下性質:
(1) 如果am-1=bn-1,則zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一個最長公共子序列;
(2) 如果am-1!=bn-1,則若zk-1!=am-1,蘊涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一個最長公共子序列;
(3) 如果am-1!=bn-1,則若zk-1!=bn-1,蘊涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一個最長公共子序列。
這樣,在找A和B的公共子序列時,如有am-1=bn-1,則進一步解決一個子問題,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一個最長公共子序列;如果am-1!=bn-1,則要解決兩個子問題,找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一個最長公共子序列和找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一個最長公共子序列,再取兩者中較長者作為A和B的最長公共子序列。

我的理解是這是一個巢狀問題:

第一種情況:如果兩個字元相等,則加一,然後再看去掉這兩個字元的餘下字串(也就是看該元素在矩陣位置上左上角的值),在左上角的基礎上加一.也就是上面的括弧1.“a0,a1,…,am-2”和“b0,b1,…,bn-2”就是看左上角的資料.

第二種情況:如果兩個字元不相等,“a0,a1,…,am-2”和“b0,b1,…,bn-1”“a0,a1,…,am-1”和“b0,b1,…,bn-2”,第一種情況是看左邊的資料,第二個是看上邊的資料.然後比較二者取其中比較大的資料.

public class Solution {
    public int getResult(String s) {
        StringBuilder s1 = new StringBuilder(s);
        StringBuilder s2 = new StringBuilder(s).reverse();
        return s.length() - LCS(s1, s2);   //返回刪除的字元
    } 
 //
計算迴文的長度 public int LCS(StringBuilder s1, StringBuilder s2) { int m = s1.length(); int n = s2.length(); int[][] mutrix = new int[m + 1][n + 1]; for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(s1.charAt(i - 1) == s2.charAt(j - 1)) mutrix[i][j] = mutrix[i - 1][j - 1] + 1; else mutrix[i][j] = Math.max(mutrix[i - 1][j], mutrix[i][j - 1]); } } for(int i=0;i<m+1;i++){ for(int j=0;j<n+1;j++){ System.out.print(mutrix[i][j]+"\t"); } System.out.println(); } return mutrix[m][n]; }
public class Main {
    public static void main(String[] args) {
        Solution s = new Solution();
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()) {
            System.out.println( s.getResult(sc.nextLine()) );
        }
        sc.close();
    }
}
結果: