面试题整理12 求字符串括号最大深度子串
2014-03-08 08:10
246 查看
题目:求一个表达式字符串中括号层次最深的第一个表达式,如表达式
"a+b+((c+d)+(e+f))",则结果为”c+d"。
分析: 一般算式会让人想起用栈分别存储操作数和符号值,但是本题目不适用,我写的代码中采用了类似于求最大连续子数组的解法,设置变量一个记录当前的括号深度,一个记录最大的括号深度,从字符串头开始遍历,当遍历到字符‘('时,当前括号深度加1,当遍历到字符‘)'时,当前括号深度减1,;当当前括号深度大于最大括号深度时,将当前括号深度赋值给最大括号深度;当当前括号深度小于0时,将当前括号深度置0。算法复杂度O(n)。
代码如下:如有错误,请大家指正。
"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"); }
相关文章推荐
- 面试题12:字符串无重复子串的最大长度
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 面试题5:求字符串中回文子串的最大长度
- 面试题之求两个字符串的最大公共子串
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 面试题:最长回文子串(即求对称字符串的最大长度 )
- 动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理
- 字符串中最大对称子串的长度(C++软件工程师面试题)
- (Relax 后缀数组1.4)POJ 2774 Long Long Message(求两个字符串公共子串的最大长度)
- 求两个字符串最大公共子串
- 两个或N个字符串最大公共子串算法
- 找出两个字符串的最大公共子串
- 【剑指offer】面试题12:打印1到最大的n位数
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 剑指offer面试题12 使用BigInteger来实现 打印1到最大的n位数
- 比较两个字符串得到两个字符串的最大子串
- 面试题12:打印1到最大的n位数
- 剑指offer-chapter3-面试题12-打印1到最大的n位数(java)
- 面试题整理17 输入一个字符串判断一个字符串是否是有效ip地址
- 剑指offer-面试题12:打印1到最大的n位数