【题目链接】

ybt 1203:扩号匹配问题
OpenJudge 2.2 2705:扩号匹配问题

【题目考点】

1. 递归

2. 栈

【解题思路】

解法1:递归

设sign字符数组,各元素初始值都是空格。sign[i]为$表示原字符串第i位置的左括号不匹配,sign[i]为?表示原字符串第i位置的右括号不匹配。将sign末尾添加’\0’,形成一个字符串。
设全局下标si,表示当前遍历到的位置。
遍历字符串:

  • 如果遇到左括号,就调用find()函数。
    find()函数的作用为:使用si遍历字符串,找到第一个右括号。

    • 如果找到左括号,则递归调用find()函数,找与这个左括号配对的右括号。
    • 如果遇到右括号,则结束调用。
    • 如果si遍历到末尾也没有发现右括号,说明这个左括号没法配对。那么在sign数组该左括号出现的位置标记为$。
  • 如果遇到右括号,那么说明该右括号无法配对,在sign数组该右括号出现的位置标记为?。

最后输出字符数组sign

解法2:使用栈

用一个栈保存左括号的下标。
遍历字符串:

  • 如果遇到左括号,则入栈该左括号的下标
  • 如果遇到右括号
    • 如果此时栈为空,说明没有左括号与这个右括号配对,标记这个位置为?
    • 如果栈不空,出栈一个左括号的下标。

遍历结束后,如果栈不空,那么不断出栈直至栈空。每个出栈的数字为一个无法配对的左括号的下标,标记这些位置为$。
输出标记数组。

【题解代码】

解法1:递归

#include <bits/stdc++.h>
using namespace std;
#define N 105
char s[N], sign[N];
int si, len;
void find()//找下一个右括号 如果找到,si指向右括号 如果没找到,做标记
{int lp = si;//当前左括号的下标 si++;while(si < len){if(s[si] == ')')return;else if(s[si] == '(')find();si++;}sign[lp] = '$';//没有找到右括号,左括号的位置标记为$
}
int main()
{while(cin >> s){len = strlen(s);for(int i = 0; i < len; ++i)//初始化sign字符串为空格 sign[i] = ' ';sign[len] = '\0';si = 0;while(si < len){if(s[si] == ')')//右括号的位置标记为? sign[si] = '?';else if(s[si] == '(')find();si++;}cout << s << endl << sign << endl;}return 0;
}

解法2:使用栈

#include <bits/stdc++.h>
using namespace std;
#define N 105
char s[N], sign[N];
int main()
{while(cin >> s){stack<int> stk;int len = strlen(s);for(int i = 0; i < len; ++i)//初始化sign字符串为空格 sign[i] = ' ';sign[len] = '\0';for(int i = 0; i < len; ++i){if(s[i] == '(')stk.push(i);else if(s[i] == ')'){if(stk.empty())//右括号遇到栈空,该右括号不配对 sign[i] = '?';elsestk.pop();}}while(stk.empty() == false)//最后栈中剩下的左括号的下标指向的左括号没有配对 {sign[stk.top()] = '$';stk.pop();}cout << s << endl << sign << endl;}return 0;
}

信息学奥赛一本通 1203:扩号匹配问题 | OpenJudge 2.2 2705:扩号匹配问题相关推荐

  1. 信息学奥赛一本通 1227:Ride to Office | OpenJudge NOI 4.6 2404:Ride to Office

    [题目链接] ybt 1227:Ride to Office OpenJudge NOI 4.6 2404:Ride to Office 原题是英文题,虽说两题题意相同,但一本通网站没有对该问题进行直 ...

  2. 信息学奥赛一本通 1020:打印ASCII码 | OpenJudge NOI 1.2 07

    [题目链接] ybt 1020:打印ASCII码 OpenJudge NOI 1.2 07:打印ASCII码 [题目考点] 1. ASCII码表 ASCII码表是一张表,规定了0~127各数字对应的字 ...

  3. 信息学奥赛一本通 1404:我家的门牌号 | OpenJudge NOI 2.1 7649:我家的门牌号 | 小学奥数 7649

    [题目链接] ybt 1404:我家的门牌号 OpenJudge NOI 2.1 7649:我家的门牌号 OpenJudge NOI 小学奥数 7649:我家的门牌号 注意:一本通OJ和OpenJud ...

  4. 信息学奥赛一本通 1229:电池的寿命 | OpenJudge NOI 4.6 2469:电池的寿命

    [题目链接] ybt 1229:电池的寿命 OpenJudge NOI 4.6 2469:电池的寿命 [题目考点] 1. 贪心 [解题思路] 1. 贪心选择性质的证明 电池分配主要有两步, 第一步:将 ...

  5. 信息学奥赛一本通 1181:整数奇偶排序 | OpenJudge NOI 1.10 06:整数奇偶排序

    [题目链接] ybt 1181:整数奇偶排序 OpenJudge NOI 1.10 06:整数奇偶排序 [题目考点] 1. 排序 [君义精讲]排序算法 [解题思路] 解法1:将奇数和偶数分开,分别排序 ...

  6. 信息学奥赛一本通 1223:An Easy Problem | OpenJudge NOI 4.6 1455:An Easy Problem

    [题目链接] ybt 1223:An Easy Problem OpenJudge NOI 4.6 1455:An Easy Problem [题目考点] 1. 数制 2. 枚举 [解题思路] 解法1 ...

  7. 信息学奥赛一本通 1177:奇数单增序列 | OpenJudge NOI 1.10 02:奇数单增序列

    [题目链接] ybt 1177:奇数单增序列 OpenJudge NOI 1.10 02:奇数单增序列 [题目考点] 1. 排序 [君义精讲]排序算法 [解题思路] 题目中说的是要先取出奇数,再对奇数 ...

  8. 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法

    [题目链接] ybt 1168:大整数加法 OpenJudge NOI 1.6 10:大整数加法 [题目考点] 1. 高精度 考察:高精加高精 高精度计算讲解 [解题思路] 注意:输入可能有多余的前导 ...

  9. 信息学奥赛一本通 1413:确定进制 | OpenJudge NOI 1.13 34:确定进制 | OpenJudge NOI 2.1 1973:确定进制

    [题目链接] ybt 1413:确定进制 OpenJudge NOI 1.13 34:确定进制 OpenJudge NOI 2.1 1973:确定进制 注意:两OJ平台上题目条件不同,ybt中:2≤b ...

最新文章

  1. 在读博士的第八年,她破解了量子计算领域最基本的问题之一
  2. 教育部发文:AI、算法等2018年进入全国高中课程!
  3. Get,Post请求中文乱码问题有效解决方法
  4. Python_基础知识储备
  5. spring boot创建多模块聚合工程
  6. rspec 测试页面元素_如何使用RSpec对Go应用进行黑盒测试
  7. Spring Security整合JWT,实现单点登录,So Easy~!
  8. vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
  9. HCIE-Security Day28:IPSec:实验(三)总部采用ISAKMP方式安全策略组与分支机构之间建立IPSec PN
  10. spring 源码解析
  11. 房地产企业项目管理的特点与目标
  12. windows 7 旗舰版 失效key
  13. 上海万国驾校 科目三考试
  14. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(III):从源代码到 FFS 文件
  15. 爱普生Epson ME OFFICE 620F 一体机驱动
  16. VS code:代码出现蓝色波浪线,提示显示 xxxx: Unknown word.cSpell
  17. 手机前缀带字幕滚动筛选
  18. word里双横线怎么打_字体下方的双横线怎么弄 word蓝色双横线
  19. 《王牌战士》正式公测:手机版的《守望先锋》你会喜欢吗?
  20. 趣味课堂之使用Python破译密码

热门文章

  1. Android关闭Activity
  2. 使用FontAwesome
  3. iOS基础 - 多媒体
  4. Peoplesoft取Translate Value标签值的方法
  5. hdu2844 Coins(普通的多重背包 + 二进制优化)
  6. 未来10年,最具颠覆性的5大指数型技术(附应用建议)
  7. Python爬取B站5000条视频,揭秘为何千万人看「哪吒」流泪
  8. asp sql 导出 excel_Mysql数据导出到excel基于python
  9. SpringBoot 如何生成接口文档,老鸟们都这么玩的!
  10. 牛逼,Java中表达式引擎工具就用它!建议收藏,一定用的到!!