zoukankan      html  css  js  c++  java
  • 【栈思想、DP】NYOJ-15 括号匹配(二)

    括号匹配(二)

    描述
    给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
    如:
    []是匹配的
    ([])[]是匹配的
    ((]是不匹配的
    ([)]是不匹配的
    输入
    第一行输入一个正整数N,表示测试数据组数(N<=10)
    每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
    输出
    对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
    样例输入
    4
    []
    ([])[]
    ((]
    ([)]
    样例输出
    0
    0
    3
    2
    【分析】
      可以运用类似栈的思想。
        1.如果是 '(' || '[' 则压栈。
        2.如果是')' || ']' 并且栈顶元素与之相匹配则将栈顶pop。
        3.如果条件2的反例,则进入循环,将当前读入的元素与栈中每个元素进行比较。
          3.1 如果匹配则跳出循环并且sum加上已尝试匹配的个数。
          3.2 如果读到栈底也不匹配则sum+1。
        4.输出结果应为 sum+“栈”中元素个数
        所以其实不能用栈来做,因为要和栈中每个元素进行挨个比较,栈没有这个操作,所以应该用两个数组,来模拟栈的操作。
      例如:(以下的“栈”应理解为数组)
        ((]))  首先将((压入“栈”,(执行第3步),然后“]”依次与“栈”中的 (( 进行比较,比较到栈底也没有元素与之相匹配(3.2),所以sum++,继续读入)),执行第2步。
          输出的答案即为1
        (([))  首先将(([压入“栈”,(执行第3步),然后“)”依次与“栈”中的 (([ 进行比较,比较到第一个 ( 时,与当前元素相匹配,跳出循环(3.1)。
          输出答案即为1
      好吧,啰嗦这么多,我也表达不清了,上代码!
    【代码】
      
     1 #include<cstdio>
     2 #include<cstring>
     3 int main(){
     4     int n;
     5     scanf("%d",&n);
     6     while(n--){
     7         char arry[105] = {'0'},stack[105] = {'0'};
     8         scanf("%s",arry);
     9         int len = strlen(arry),i,flag,temp,sum = 0;
    10         int top = 0,k;
    11         for(i = 0;i < len;i++){
    12             temp = flag = 0;
    13             k = top;
    14             if(arry[i] == '(' || arry[i] == '[')
    15                 stack[top++] = arry[i];
    16             else if(arry[i] == ')' && stack[top - 1] == '(' || arry[i] == ']' && stack[top - 1] == '['){
    17                 top--;
    18             }else{
    19                 while(k!=0){
    20                     if(arry[i] == ')' && stack[k - 1] == '(' || arry[i] == ']' && stack[k - 1] == '['){
    21                         temp = 1;
    22                         top = k - 1;
    23                         break;
    24                     }else{
    25                         flag += 1;
    26                     }
    27                     k--;
    28                 }
    29                 if(!temp)
    30                     sum += 1;
    31                 else 
    32                     sum += flag;
    33             }
    34         }
    35         sum += top;
    36         printf("%d
    ",sum);
    37     }
    38     return 0;
    39 }

    当然也可以用DP的思想,先挖好坑,待研究。。。

  • 相关阅读:
    Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
    Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
    Atitit 图像处理 灰度图片 灰度化的原理与实现
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    Atitit 实现java的linq 以及与stream api的比较
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库
    Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
    Atitit apache 和guava的反射工具
    atitit。企业的价值观 员工第一 vs 客户第一.docx
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4455667.html
Copyright © 2011-2022 走看看