括号匹配

参考文章括号匹配
括号匹配2

#括号字符的有效性
##给定一个字符串,求最长有效括号子串长度。
其中有效括号子串中不能含有其他字符。

#例如:
() 最长有效括号子串长度2;
()() 最长有效括号子串长度4;
(()) 最长有效括号子串长度4;
(()()) 最长有效括号子串长度6;
()a() 最长有效括号子串长度2;

#解析:
用动态规划求解,可以做到时间复杂度为O(N),额外空间复杂度为O(N).首先生成长度和str字符串一样的数组dp[],dp[i]值的含义为str[0…i]中必须以字符str[i]结
尾的最长的有效括号子串长度。那么dP[i]值可以按如下方式求解

1.dp[0]=0。只含有一个字符肯定不是有效括号字符串,长度自然是0。

2.从左到右依次遍历str[1…N-1]的每个字符,假设遍历到str[i]。

3.如果str[i]=’(’,有效括号字符串必然是以’)’结尾,而不是以’(‘结尾,所以dp[i] = 0。

4.如果str[i]=’)’,那么以str[i]结尾的最长有效括号子串可能存在。dp[i-1]的值代表必须以str[i-1]结尾的最长有效括号子串的长度,所以如果i-dp[i-1]-1位置上的字符是’(’,就能与当前位置的str[i]字符再配出一对有效括号。比如”(()())”,假设遍历到最后一个字符’)’必须以倒数第二个字符结尾的最长有效括号子串是”()()”,找到这个子串之前的字符,即i-dp[i-1]-1位置的字符,发现是’(‘,所以它可以和最后一个字符再配出一对有效括号。如果该情况发生,dp[i]的值起码是dp[i-1]+2.
5.还有一部分长度容易被人忽略。比如,”()(())”,假设遍历到最后一个字符’)’,通过上面的过程找到的必须以最后字符结尾的最长有效括号子串起码是”(())”,但是前面还有一段可以结合在一起构成更大的有效括号子串。也就是说,str[i-dp[i-1]-1]和str[i]配成了一对,这时还应该把dp[i-dp[i-1]-2]的值加到dp[i]中,这么做表示把str[i-dp[i-l]-2]结尾的最长有效括号子串接到前面,才能得到以当前字符结尾的最长有效括号子串。
6.dp[0…N-1]中的最大值就是最终的结果。

#Java程序:

public static int maxLength(String str) {
	if (str == null || str.equals("")) {
		return 0;
	}
	char[] chas = str.toCharArray();
	int[] dp = new int[chas.length];
	int pre = 0;
	int res = 0;
	for (int i = 1; i < chas.length; i++) {
		if (chas[i] == ')') {
			pre = i - dp[i - 1] - 1;
			if (pre >= 0 && chas[pre] == '(') {
				dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
			}
		}
		res = Math.max(res, dp[i]);
	}
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值