【发布时间】:2012-10-15 23:10:39
【问题描述】:
给定问题:
一串括号据说是
如果字符串中的左括号和右括号可以正确配对,则平衡。例如,字符串“(())”和“()()”都是平衡的,而字符串“(()(”)不是
均衡。
给定一个由括号组成的长度为 n 的字符串 S,假设您想找到平衡的 S 的最长子序列。使用动态规划,设计一种算法,在 O(n^3) 时间内找到 S 的最长平衡子序列。
我的做法:
假设给定字符串:S[1 2 ... n]
当 S[i] == ')' 时,有效的子序列可以在 S[i] 处结束,即 S[i] 是右大括号,并且在 S[i] 之前至少存在一个未使用的左大括号。这可以在 O(N) 中实现。
#include<iostream>
using namespace std;
int main(){
string s;
cin >> s;
int n = s.length(), o_count = 0, len = 0;
for(int i=0; i<n; ++i){
if(s[i] == '('){
++o_count;
continue;
}
else if(s[i] == ')' && o_count > 0){
++len;
--o_count;
}
}
cout << len << endl;
return 0;
}
我尝试了几个测试用例,它们似乎运行良好。我在这里错过了什么吗?如果不是,那我该如何为这个问题设计一个 O(n^3) 动态规划解决方案?
这是我正在使用的subsequence 的定义。
谢谢!
【问题讨论】:
-
您的程序为
()()返回 2,为()()(()返回 3。两者都应该是 4。 -
@JohnKugelman - 为什么第二个不应该是
6?如果他的程序返回对的数量,它会返回正确的结果 2。乘以 2 得到实际的字符串长度。 -
@IVlad 平衡的括号必须相邻。
-
@JohnKugelman - 我不确定你的意思。
()()()是()()(()的长度为 6 (3*2) 的平衡子序列。它也是最长的平衡子序列,并且 OP 的程序正确地找到了它的(一半)长度。 -
是的,返回值为否。适当平衡的最长子序列中的对。
标签: algorithm dynamic-programming