唉,心情全无。
难受啊。
class Solution {
public:
/**
*
* @param s string字符串
* @return int整型
*/
int longestValidParentheses(string s) {
int res = 0;
// 连续括号结束的位置(最后一个非连续括号)
int start = -1;
std::stack<int> st;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
st.push(i);
} else {
if (st.empty()) {
start = i;
} else {
st.pop();
if (!st.empty()) {
res = std::max(res, i - st.top());
} else {
res = std::max(res, i - start);
}
}
}
}
return res;
}
};
动态规划转移有点费劲
class Solution {
public:
/**
*
* @param s string字符串
* @return int整型
*/
int longestValidParentheses(string s) {
if (s.empty()) {
return 0;
}
// dp[i] 代表以下表i为结尾的字符串的最长括号子串
std::vector<int> dp(s.size(), 0);
int res = 0;
// 只需要查看右括号,以左括号结尾的字符串一定不会是子串
for (int i = 1; i < s.size(); ++i) {
if (s[i] == ')') {
if (s[i - 1] == '(') {
dp[i] = (i > 1 ? dp[i - 2] : 0) + 2;
// 找到与之匹配的左括号
} else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {
dp[i] = (i - dp[i - 1] > 1 ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2;
}
}
res = std::max(res, dp[i]);
}
return res;
}
};