C代码
#define MAX_ONE(a,b) ((a)>(b)?(a):(b))
int longestValidParentheses(char * s){
int len;
int *dp = NULL;
int max = 0;
int i;
len = strlen(s);
if (len < 2) {
return 0;
}
dp = calloc(len, sizeof(int));
dp[0] = 0;
if(s[0] == '(' && s[1] == ')') {
dp[1] = 2;
max = MAX_ONE(max, dp[1]);
} else {
dp[1] = 0;
}
for(i = 2; i < len; i++) {
if(s[i] == '(')
continue;
if(s[i-1] == '(') {
dp[i] = dp[i-2] + 2;
max = MAX_ONE(max, dp[i]);
} else {
int pre = i - dp[i-1] - 1;
if(pre < 0)
continue;
if(s[pre] != '(')
continue;
dp[i] = dp[i-1] + 2;
max = MAX_ONE(max, dp[i]);
if(pre - 1 < 0)
continue;
dp[i] += dp[pre-1];
max = MAX_ONE(max, dp[i]);
}
}
return max;
}
注意点
- 每次赋值给
dp
都需要比较生成MAX_ONE
; - 宏
MAX_ONE
的返回值需要max
去接收;(最近精神比较恍惚,出这些问题真不该)
结果
题目
内存优化版本
待续