消除嵌套的括号 clear brace in string
来源:互联网 发布:手机淘宝没有了淘抢购 编辑:程序博客网 时间:2024/06/17 08:40
题目源自于百度公司2014校园笔试的一道字符串题。
题目:给定一个如下格式的字符串(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。
思路:希望算法所占空间越小越好。做到不用栈来匹配括号、不用临时数组来存储新字符串。
空间上:
在括号匹配的逻辑上,遇到左括号入栈,遇到右括号出栈,这里只用一个int来表示当前“虚拟栈”中的元素个数,而不是真的用栈。当栈中元素个数为负,则不符合逻辑,即匹配出错。
因为字符串元素只删不增。这里用两个指针来原地转换。旧字符串和新字符串都是原地字符串。
时间上:
顺序扫描字符串一遍。
代码:
#include <stdio.h>int clear_brace(char *str){if(str == NULL)return -1;char *a,*b;int num = 0;a = b = str;if(*a == '('){a++;b++;num++;}elsereturn -1;while(*(a+1) != '\0'){if(*a == '('){num++;a++;}else if(*a == ')'){num--;if(num < 1)return -1;a++;}else{*b = *a;a++;b++; }}if(*a == ')' && num == 1){*b = *a;*(b+1) = *(a+1);}elsereturn -1;return 1;}int main(){char a[] = "(1,(2,3),(4,(5,6),7))";printf("%d\n", clear_brace(a));printf("%s\n", a);return 1;}
注意:别忘记检查最后“栈”中是否是空,即完全匹配。
- 消除嵌套的括号 clear brace in string
- 消除嵌套括号
- Eclipse的花括号(brace)的输入偏好问题
- Eclipse的花括号(brace)的输入偏好问题
- bash的brace expansion(大括号扩展)功能
- string:clear的用法
- 花括号展开(Brace Expansion)
- 消除字符串中成对的括号
- HTML5第六课时,float浮动影响的消除,clear
- string.clear()
- HDU 1870 愚人节的礼物 消除左右括号
- 有关java的double brace initialization
- C++基础---string类的clear/erase/pop_back
- C++基础---string类的clear/erase/pop_back
- golang --嵌套括号匹配
- xpath里面的括号是可以嵌套的!!!!
- in.clear()、cin.sync()和cin.ignor()的用法
- 寻找表达式嵌套深度最大的括号表达式
- 服务器设计系列:日志模块
- Spring MVC登录模块执行流程
- 有关属性传值
- android adb常用命令总结
- ios xcode在运行时总是提示输入用户名和密码
- 消除嵌套的括号 clear brace in string
- [模板]运算类
- c++ virtual 实例分析
- HTML5开发工具盘点
- UNIX网络编程——原始套接字SOCK_RAW
- 用HTML5的<DOCTYPE>标签兼容各版本IE浏览器的方法技术
- Oracle10g 安装步骤
- Java的字节输出流OutputStream小结
- JS 模式对话框 form提交 重新打开窗口问题