关闭

32 Longest Valid Parentheses

51人阅读 评论(0) 收藏 举报

文字分析部分摘自

http://blog.csdn.net/zhangwei1120112119/article/details/16812679



求最长的括号匹配的子串

比如

())()()的括号匹配的子串为(),()()两个,最长的长度为4

解法:

维护一个栈,栈底值为上次匹配失败的位置

首先初始放一个-1入栈代表上次匹配失败的地方为-1

依次扫描字符

若为'(',将位置放入栈中

若为')',若栈中元素大于1个,则代表有'('可匹配,更新最优值,否则更新栈底

显然,对于任意一个部分最长子串,其最后一个字符更新时取的是上一次匹配失败的位置,故所有部分最长子串取得最优结果


public static int longestValidParentheses(String s)
	{
		int len = s.length();
		if (len < 2)
			return 0;

		Stack<Integer> stack = new Stack<>();
		stack.push(-1);
		int ret = 0;
		for (int i = 0; i < len; i++)
		{
			if (s.charAt(i) == '(')
				stack.push(i);
			else
			{
				if (stack.size() > 1)
				{
					stack.pop();
					ret = Math.max(ret, i - stack.peek());
				} 
				else
				{
					stack.pop();
					stack.push(i);
				}
			}
		}
		return ret;
	}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31726次
    • 积分:2721
    • 等级:
    • 排名:第13688名
    • 原创:246篇
    • 转载:71篇
    • 译文:0篇
    • 评论:0条