给定问题:
如果字符串中的左括号和右括号可以正确配对,则称该字符串是平衡的。例如,字符串 "(())" 和 "()()" 都是平衡的,而字符串 "(()(" 是不平衡的。给定一个由括号组成的长度为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)动态规划解决方案?
这是我正在使用的子序列的定义。
谢谢!