筆試題(一) 構造迴文字串
並沒有筆試,從網上看到這個問題,想了很久,通過參開別人的部落格才看懂.記錄一下
題目:
給定一個字串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();
}
}
結果: