首页 > 试题广场 >

最长公共子括号序列

[编程题]最长公共子括号序列
  • 热度指数:10 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 98M,其他语言196M
  • 算法知识视频讲解
一个合法的括号匹配序列被定义为:
1. 空串""是合法的括号序列
2. 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列
3. 如果"X"是一个合法的序列,那么"(X)"也是一个合法的括号序列
4. 每个合法的括号序列都可以由上面的规则生成
例如"", "()", "()()()", "(()())", "(((()))"都是合法的。
从一个字符串S中移除零个或者多个字符得到的序列称为S的子序列。
例如"abcde"的子序列有"abe","","abcde"等。
定义LCS(S,T)为字符串S和字符串T最长公共子序列的长度,即一个最长的序列W既是S的子序列也是T的子序列的长度。
小易给出一个合法的括号匹配序列s,小易希望你能找出具有以下特征的括号序列t:
1、t跟s不同,但是长度相同
2、t也是一个合法的括号匹配序列
3、LCS(s, t)是满足上述两个条件的t中最大的
因为这样的t可能存在多个,小易需要你计算出满足条件的t有多少个。

如样例所示: s = "(())()",跟字符串s长度相同的合法括号匹配序列有:
"()(())", "((()))", "()()()", "(()())",其中LCS( "(())()", "()(())" )为4,其他三个都为5,所以输出3.

输入描述:
输入包括字符串s(4 ≤ |s| ≤ 50,|s|表示字符串长度),保证s是一个合法的括号匹配序列。


输出描述:
输出一个正整数,满足条件的t的个数。
示例1

输入

(())()

输出

3
比较暴力的解法,没什么优化 import java.util.HashSet; public class TestKuoHao { private HashSet<String> set = new HashSet<>(); private boolean isLegal(char[] s) { if (s == null) return false; int count = 0; for (char c : s) { if (c == '(') { count++; } else { count--; } if (count < 0) return false; } return true; } private void swap(char[] a, int i, int j) { char temp = a[i]; a[i] = a[j]; a[j] = temp; } private int getCount(String s) { int len = s.length(); char[] a; set.add(s); for (int i = 0; i < len - 1; i++) { a = s.toCharArray(); for (int j = i; j < len - 1; j++) { swap(a, j, j + 1); if (isLegal(a)) { set.add(String.valueOf(a)); } } } for (int i = len - 1; i > 0; i--) { a = s.toCharArray(); for (int j = i; j > 0; j--) { swap(a, j, j - 1); if (isLegal(a)) { set.add(String.valueOf(a)); } } } set.remove(s); for(String ss : set) { System.out.println(ss); } return set.size(); } public static void main(String[] args) { String s = "(())()"; System.out.println(new TestKuoHao().getCount(s)); } }
编辑于 2021-05-25 23:44:33 回复(0)