添加最少括号使得给定括号字符串匹配
来源:互联网 发布:java猜数字游戏界面 编辑:程序博客网 时间:2024/04/28 02:10
问题:
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的,所需括号个数为 0.
([])[]是匹配的, 所需括号个数为 0.
((]是不匹配的, 所需最少括号个数为 3.
([)]是不匹配的,所需最少括号个数为 2.
分析:
此题来自:http://blog.csdn.net/coolanfei/article/details/7475542, 作者同时给出了正确答案。但是,感觉答案还不是特别的详细,也不是特别容易懂。所以,在此写下自己的分析思路。
1. 我们用 mb[i][j] 表示从位置 i 到字符位置 j 所需的最少括号数。假定字符串是 “[ ( )”, 那么 mb[0][0] = mb[1][1] = mb[2][2] = 1。
2. 如果我们要算mb[i][j+1], 那么,最坏的情况是使得没有被匹配的括号数增加了,即 mb[i][j+1] 最多为 min( mb[i][j] + 1, mb[i+1][j+1] + 1). 但是,这可能不是我们想要的答案,因为在刚才的例子里,即:假定字符串是 “[ ( )”, 那么 mb[0][1] = mb[0][0] + 1= 2, 但是 mb[1][2] 却不等于 mb[1][1] + 1.
3. 那么,什么情况下mb[i][j+1] = mb[i][j] + 1?只有当 字符串里从i 到 j 没有任何字符与第 j + 1 个字符匹配的时候。但是,如果存在和第 j + 1 个字符匹配的情况,问题就不一样了。
4. 假设在i 到 j 之间存在一个字符(比如在位置 k)与第 j + 1 个字符匹配,那么我们相当于把原来的字符串分成了两个部分mb[i][k-1] 和 mb[k+1][j], 因为第k 个 和 j + 1 个字符已经匹配掉了。而且,我们不会再考虑 i 到 k - 1 的字符会和 k + 1 到 j 之间的字符匹配的情况,因为我们已经把这两个部分完全分开了(很重要的一点,这也是我当时思考很久的地方)。话句话说 mb[i][j+1] = min(min( mb[i][j] + 1, mb[i+1][j+1] + 1), mb[i][k-1] + mb[k+1][j]).
有了这样的分析,我们可以利用动态规划的思路来解决这样的问题。代码如下:
static boolean match(char a, char b){ if(a == '(' && b == ')') return true; if(a == '[' && b == ']') return true; return false; }
public static void minBrace(String s) {int size = s.length();// we begin with mb[1][1]int[][] mb = new int[size + 1][size + 1];for(int i = 1; i <= size; ++i){ mb[i][i] = 1; }// d refers to the distance between i and j, that is d = j - i for(int d = 1; d < size; d++){ for (int i = 1; i + d <= size; i++) { int j = i + d; // the worst case mb[i][j] = Math.min(mb[i][j - 1], mb[i + 1][j]) + 1; // the case in which a char between i and j (= i + d) matches // the character at position j + 1 for (int k = i ; k <= j - 1; k++ ) { if (match(s.charAt(k - 1), s.charAt(j - 1)) == true) { mb[i][j] = Math.min(mb[i][j], mb[i][k - 1] + mb[k + 1] [j - 1]); } } } } System.out.println(mb[1][size]); }转载请注明出处:http://blog.csdn.net/beiyeqingteng
- 添加最少括号使得给定括号字符串匹配
- 添加最少括号使得给定括号字符串匹配
- 添加最少括号使得给定括号字符串匹配
- 添加最少括号使得给定括号字符串匹配
- 添加最少括号匹配给定括号字符串
- uva 1626 添加最少的括号使得括号匹配
- 区间dp理解 添加最少的括号使得括号字符串匹配
- 括号匹配之添加最少括号匹配
- 2.字符串括号匹配
- 字符串括号匹配检查
- 字符串括号匹配
- 括号字符串匹配
- java 字符串括号匹配
- 括号括号括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- JVM调优总结 -Xms -Xmx -Xmn -Xss
- Linux上面星际译王安装词典
- 浅析GLib
- 洗牌算法
- HashMap与HashTable区别
- 添加最少括号使得给定括号字符串匹配
- xcode 常用 累积
- window.open打开子窗口后关闭父窗口实现
- Perl中our,my,local的区别与联系
- libusb使用
- 接口Comparable实现List排序
- linux各版本内核当中的多点触摸驱动
- 编译 & 链接 & 加载
- c#中foreach与接口IEnumerator和IEnumerable