当前位置: 首页 > news >正文

POJ3704 括号匹配问题 递归方法

目录

题目

算法

完整代码


题目

参考

递归:

https://blog.csdn.net/qq_45272251/article/details/103257953

利用了递归, 但思路稍复杂了

循环:

https://blog.csdn.net/weixin_50340097/article/details/114579805

(看起来是递归其实是循环. 每次递归其实是循环内一次迭代, 没有使用递归的精髓)

https://blog.csdn.net/qq_38851184/article/details/104252592

循环这篇文章的收获, 额外定义状态数组记录对应位置是否匹配.

本文利用递归栈的特性, 力求简明快速地解决这个问题.

算法

首先定义全局变量

(1)待匹配的字符串str2;

(2)定义字符数组state用来记录每个位置的匹配状态. (尚未匹配上的全部标注为$或? , 待匹配上后改回来.)

递归函数输入参数

(1)查找开始位置start

(2)未匹配左括号个数(递归栈内剩余元素)leftnum

递归函数返回值

右括号位置('0'代表无可匹配的右括号)

递归算法流程:

1.如果当前下标对应字符串是'(',记录为'$'

        (1)左括号入栈: 调用递归栈从下一个位置开始寻找左括号. start=pos+1, leftnum=leftnum+1.

        (2)若左括号匹配成功. 配对的左右括号记录为' '. 从已经找到的右括号右侧继续下一次循环.

        (3)若左括号匹配失败, 出栈(返回匹配失败记号0). (所调用的递归已遍历到字符串结束.)

2.如果当前下标对应字符串是')',记录为'?'

        (1)若栈非空(leftnum!=0), 左括号出栈: 即递归函数返回(返回值右括号位置pos). 

        (2)若栈空(leftnum==0): 没有左括号时,说明在递归最外层, 不返回, 继续循环.

3、如果当前下标对应的字符既不是'('也不是')',,记录为' '.

完整代码

#include <bits/stdc++.h>
using namespace std;
#define MAXN 105char str2[MAXN];
char state[MAXN];int match(int start, int leftnum){int right=0;if(start>=strlen(str2))//匹配到最后返回return 0;for(int pos=start;pos<strlen(str2);pos++){if(str2[pos]=='('){//情况1.出现左括号state[pos]='$';//记录未匹配的左括号right=match(pos+1,leftnum+1);printf("(:%d; ):%d\n",pos,right);if(right>0){//匹配成功state[pos]=' ';state[right]=' ';pos=right;//跳过上次找过的地方}else{//如果到最后都没有找到, 说明整个字符串都被遍历过了return 0;}// match(right+1,leftnum);//没有需要匹配的左括号就不入递归栈// break;}else if(str2[pos]==')'){//情况2. 出现右括号state[pos]='?';// printf("):%d\n",pos);// match(pos+1);//永远由左括号触发下一层递归入栈, 右括号控制出栈if(leftnum>0){//栈非空return pos;}}else{//情况3. 左右括号都不是state[pos]=' ';}}return 0;
}int main()
{while(gets(str2)){memset(state,'\0',sizeof(state));match(0,0);puts(str2);puts(state);cout<<endl;}return 0;
}

运行效果:

http://www.lryc.cn/news/63988.html

相关文章:

  • leetcode — JavaScript专题(三):完全相等的 JSON 字符串、复合函数、 分组、柯里化、将对象转换为 JSON 字符串
  • OGNL 的表达式
  • JAVA面试中遇到的那些坑,80%的人都种过招
  • 【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)
  • linux中一条命令查询当前端口的进程,然后拿到进程pid,作为另一条杀死进程的参数
  • 程序员找工作难吗?我用亲身经历来告诉大家
  • 【Web服务】HTTP和DNS重要知识
  • 【C++】-关于类和对象的默认成员函数(中)-拷贝构造函数和赋值运算符重载函数
  • c++11上篇
  • 异构无线传感器网络路由算法研究(Matlab代码实现)
  • MySQL数据库——MySQL TRUNCATE:清空表记录
  • 财报解读:连续三年逆势增长的背后,欧派家居到底靠的是什么?
  • 希望计算机专业同学都知道这些宝藏博主
  • 1694_week1_MIT使用Python编程学习手记1
  • 第二十一章 光源
  • CVPR 2023 超分辨率(super-resolution)方向上接收论文总结
  • Python 基于 Django 的学生成绩管理系统,可视化界面(附源码,教程)
  • 第二弹进阶吴恩达 ChatGPT Prompt 技巧
  • 约瑟夫环问题
  • JavaScript中的异步编程
  • 奥斯汀独家对话|从机构的「拉扯」中成长的美国加密监管
  • PostgreSQL16中pg_dump的LZ4和ZSTD压缩
  • 网络安全基础入门学习路线
  • 错误检测技术:奇偶校验
  • 语义版本控制规范(SemVer)
  • 基于Flask的留言板的设计与实现
  • vmware 详细安装教程
  • Python 爬虫工具
  • 再也不去字节跳动面试了,6年测开经验的真实面试经历.....
  • 第十五章 角色移动旋转实例