Java算法题-解析 "最长有效括号" 算法问题

题目:
给定一个只包含字符 '(' 和 ')' 的字符串,要求找出最长的有效括号子串的长度。
引言:
"最长有效括号" 是一个字符串处理问题,要求找出字符串中的最长有效括号子串,其中有效括号子串是指连续的一段字符序列,满足括号的匹配规则。解决这个问题需要对字符串处理和括号匹配有深刻理解,同时需要找到一种方法来处理括号的匹配。通过解答这个问题,我们可以提升对字符串操作、栈数据结构和问题规模的考虑,同时也能拓展对括号匹配和处理的应用。
算法思路:
我们可以使用栈来解决这个问题。具体思路如下:
- 定义一个栈,用来保存括号的下标。
- 初始化一个变量
start
,用来记录有效括号子串的起始位置。 - 遍历字符串,遇到左括号 '(' 则将其下标入栈。
遇到右括号 ')' 时,分两种情况处理:
- 如果栈为空,则将
start
更新为当前位置的下一位。 - 如果栈不为空,则将栈顶元素出栈,并计算当前位置与栈顶元素的距离,更新最长有效括号子串的长度。
- 如果栈为空,则将
- 遍历结束后,栈中剩余的元素记录的是不能匹配的括号下标,根据这些下标和
start
可以计算出最长有效括号子串的长度。
代码实现:
以下是使用 Java 实现的 "最长有效括号" 算法的示例代码:
import java.util.*;
public class LongestValidParentheses {
public int longestValidParentheses(String s) {
Stack<Integer> stack = new Stack<>();
int start = 0;
int maxLength = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
if (stack.isEmpty()) {
start = i + 1;
} else {
stack.pop();
if (stack.isEmpty()) {
maxLength = Math.max(maxLength, i - start + 1);
} else {
maxLength = Math.max(maxLength, i - stack.peek());
}
}
}
}
return maxLength;
}
}
算法分析:
- 时间复杂度:遍历字符串一次,每个字符都可能入栈和出栈一次,所以时间复杂度为 O(n),其中 n 是字符串的长度。
- 空间复杂度:需要额外的空间存储栈,所以空间复杂度为 O(n),其中 n 是字符串的长度。
示例和测试:
假设给定字符串为 "(()))())(""
,根据算法,最长有效括号子串的长度为 4
(子串为 "()()"
)。
我们可以使用以下代码进行测试:
public class Main {
public static void main(String[] args) {
LongestValidParentheses solution = new LongestValidParentheses();
String s = "(()))())(";
int maxLength = solution.longestValidParentheses(s);
System.out.println("Longest valid parentheses length: " + maxLength);
}
}
总结:
"最长有效括号" 算法问题要求找出字符串中的最长有效括号子串,是一个考察字符串处理和栈数据结构的问题。通过实现这个算法,我们可以提升对字符串操作、栈数据结构和问题规模的考虑,同时也能拓展对括号匹配和处理的应用。这个问题强调了在解决编程难题时,如何使用栈来处理括号匹配和有效子串的计算的重要性。