问题描述:括号序列问题(类似平衡符号问题(利用栈实现))。
定义如下规则序列(字符串)
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