第一次博客,大家将就下...
给定只包含括号字符'('和 ')''的字符串,请找出最长的有效括号内子括号的长度。
举几个例子如下:
例如对于"( ()",最长的有效的括号中的子字符串是"()" ,有效双括号数1个,故它的长度为 2。 再比如对于字符串") () () )",其中最长的有效的括号中的子字符串是"() ()",有效双括号数2个,故它的长度为4。 再比如对于"( () () )",它的长度为6。
只考虑最长有效括号:
我的思路是由字符串第一个开始,遇到"("即个数+1
case '(':
{
LeftBra++; //前面左括号的个数
},
若是")",则进行匹配,左括号个数并自减,
case ')':
{
if (LeftBra > 0) //遇见右边括号,匹配
{
LeftBra--;
sum++;
}
break;
}
直至结束。
由于个人原因,交到英雄会上结果是错的,不知道是自己处理的问题,还是什么问题,希望各位指教。
其中一个想法是最长有效括号的长度是得连续的。
如题目中所给就是连续的。
而本人的处理"())(()())"字符串,结果为:
实际上连续的只有尾端的"(()())",被第三个")"隔断,长度为6。
这个大家可以试试
代码附上,大家交流:
#include <stdio.h>
#include <string.h>
int longestValidParentheses(char *s)
{
int LeftBra = 0; //初始左括号
int sum = 0; //有效括号
int n = strlen(s); //字符串长度
int i;
for (i = 0; i < n; i++)
{
switch (s[i])
{
case '(':
{
LeftBra++; //前面左括号的个数
}
break;
case ')':
{
if (LeftBra > 0) //遇见右边括号,匹配
{
LeftBra--;
sum++;
}
break;
}
default:
break;
}
}
return sum * 2;
}
int main ()
{
char* s = "())(()())";
int sum = longestValidParentheses (s);
printf ("%s\n", s);
printf ("sum=%d\n", sum);
return 0;
}
动态规划的已完成,见下篇...
多多交流o(∩_∩)o