2014年有道研發崗算法題(9月17):規則序列問題

問題描述:括號序列問題(類似平衡符號問題(利用棧實現))。

定義如下規則序列(字符串)

1.空序列是規則序列

2.如果S是規則序列,那麼(S)和[S]也是規則序列

3.如果A和B都是規則序列,則AB和BA都是規則序列

例子:規則序列:

()

[]

(())

([][])

不規則序列

(

[

]]

(]]

給出一些由'(',')','[',']'符號組成的,請問至少還需要多少個符號才能構成規則序列。

括號序列,採用動態規劃處理:

dp[ i ][ j ] 存儲 i~j 這段括號序列需要添加的括號數,決策有兩種,對dp[ i ][ j ],

       (1).若i 與j 是匹配的,只需將i+1~j-1這段變成合理的括號序列;

       (2).取i~j中間的k, 使i~p 和 p+1~j 均爲合理的括號序列。

狀態轉移方程:dp[ i ][ j ] = MIN( dp[ i + 1 ][ j - 1 ], MIN(dp[ i ][ k ]+dp[ k+1 ][ j ]) ), 其中i <= p < j.。


JAVA代碼實現如下(代碼不涉及對字符串的空值,合法性等的檢查,實現比較簡陋,目的就是爲了實現算法而已):

package yd;

public class BalanceSeq {
    public static int getMinNumber(String seq) {
        int length = seq.length();
        int INT_MAX = length;
        int[][] dp = new int[length][length];
        int j = 0;
        for (int m = 1; m <= length; m++) {
            for (int i = 0; i + m - 1 < length; i++) {
                j = i + m - 1;
                if (i == j)
                    dp[i][j] = 1;
                else {
                    dp[i][j] = INT_MAX;
                    if ((seq.charAt(i) == '(' && seq.charAt(j) == ')')
                            || (seq.charAt(i) == '[' && seq.charAt(j) == ']')) {
                        if (i + 1 == j)
                            dp[i][j] = 0;
                        else {
                            if (dp[i][j] > dp[i + 1][j - 1])
                                dp[i][j] = dp[i + 1][j - 1];
                        }
                    }
                    for (int k = i; k < j; k++)
                        if (dp[i][j] > dp[i][k] + dp[k + 1][j]) {
                            dp[i][j] = dp[i][k] + dp[k + 1][j];
                        }
                }
            }
        }
        return dp[0][length - 1];
    }

    public static void main(String[] args) {
        System.out.println(getMinNumber("(]])(])[)]"));

    }
}


result:4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章