問題描述:括號序列問題(類似平衡符號問題(利用棧實現))。
定義如下規則序列(字符串)
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