面试题整理12 求字符串括号最大深度子串

题目:求一个表达式字符串中括号层次最深的第一个表达式,如表达式


"a+b+((c+d)+(e+f))",则结果为”c+d"。

分析: 一般算式会让人想起用栈分别存储操作数和符号值,但是本题目不适用,我写的代码中采用了类似于求最大连续子数组的解法,设置变量一个记录当前的括号深度,一个记录最大的括号深度,从字符串头开始遍历,当遍历到字符‘('时,当前括号深度加1,当遍历到字符‘)'时,当前括号深度减1,;当当前括号深度大于最大括号深度时,将当前括号深度赋值给最大括号深度;当当前括号深度小于0时,将当前括号深度置0。算法复杂度O(n)。

代码如下:如有错误,请大家指正。


char* FindMostDeepExpression(const char* str)
{
	if(str == NULL)
		return NULL;
	int nLength = strlen(str);
	if(nLength < 2)
		return (char*)str;
	int maxDeepNum = 0;
	int tempDeepNum = 0;
	int startIndex = 0;
	int endIndex = nLength-1;
	bool isEnd = false; //标志是结束
	for(int i=0; i<nLength; ++i)
	{
		if(str[i] == '(')
		{
			++tempDeepNum;
			if(tempDeepNum > maxDeepNum )
			{
				maxDeepNum = tempDeepNum;
				isEnd = false;
				startIndex = i+1;
			}
		}else if( str[i] == ')')
		{
			if( tempDeepNum == maxDeepNum && !isEnd)
			{
				endIndex = i-1;
				isEnd = true;
			}
			-- tempDeepNum;
			if(tempDeepNum < 0)
			{
				tempDeepNum = 0;
			}
		}
	}
	char *result = new char[endIndex-startIndex+2];
	strncpy(result,str+startIndex,endIndex-startIndex+1);
	result[endIndex-startIndex+1] = '\0';
	return result;
}
void Test(char *testName, char* str,char* expectResult)
{
	if( testName!= NULL)
		printf("%s begins:\n",testName);
	if(expectResult != NULL)
		printf("expected result is %s \n",expectResult);

	
	char* result = FindMostDeepExpression(str);
	printf("the actual result is : %s \n",result);

}
void Test1()
{
	char* str = NULL;
	Test("Test1",str,NULL);
}
void Test2()
{
	char* str = "a+b";
	Test("Test2",str,"a+b");
}
void Test3()
{
	char* str = "a+b+((c+d)+(e+f))";
	Test("Test3",str,"c+d");
}
void Test4()
{
	char* str = "a+b+((c+d)+(e+f))";
	Test("Test3",str,"c+d");
}
void Test5()
{
	char* str = "a+(b+c)";
	Test("Test5",str,"b+c");
}
int main()
{
	
	Test1();
	Test2();
	Test3();
	Test4();
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值