我的朋友在面试中遇到了一个问题,被告知有一个O(n)的解决方案。然而,我们两个都想不出来。以下是问题:
有一个字符串只包含括号 (
和 )
,请找出最长的有效括号子串的长度,该子串应该是格式良好的。
例如,对于字符串 ")()())"
,最长的有效括号子串是 ()()
,长度为 4。
我用动态规划想出来了,但它不是O(n)。有什么想法吗?
public int getLongestLen(String s) {
if (s == null || s.length() == 0)
return 0;
int len = s.length(), maxLen = 0;
boolean[][] isValid = new boolean[len][len];
for (int l = 2; l < len; l *= 2)
for (int start = 0; start <= len - l; start++) {
if ((s.charAt(start) == '(' && s.charAt(start + l - 1) == ')') &&
(l == 2 || isValid[start+1][start+l-2])) {
isValid[start][start+l-1] = true;
maxLen = Math.max(maxLen, l);
}
}
return maxLen;
}
(
加1并对每个)
减1时,就会进行计数。 - n. m.()()()
)和任何不能通过将单个括号对添加到另一个有效序列来生成的有效序列((())(())
)。 - Leonid Vasilev