zoukankan      html  css  js  c++  java
  • 2018京东---牛牛的括号匹配

    原题链接

    题目大意:给出一串字符串,只允许且必须交换一次,让其成为合法的括号匹配的字符串。

    法一(借鉴):这里交换,换成直接改变,到最后再做处理即可。用flag标记字符串是否合法。遇到'(',则压栈;遇到')',栈非空则退栈,栈空则标记flag为非法,且变为'(',然后压栈。最后判断:如果flag标记合法,则栈空返回yes,栈非空返回no;如果flag标记非法,则栈中元素=2,则返回yes,否则返回no。代码如下:

     1     public static void main(String[] args) throws IOException {
     2         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
     3         String line = in.readLine();
     4         int t = Integer.parseInt(line);
     5         while(t-- != 0) {
     6             line = in.readLine();
     7             int len = line.length();
     8             Stack<Character> s = new Stack<Character>();
     9             int pos = 0;
    10             boolean flag = false;
    11             //“()”这种情况特殊处理
    12             if(len == 2 && line.charAt(0) == '(' && line.charAt(1) == ')') {
    13                 System.out.println("No");
    14                 continue;
    15             }
    16             //遍历字符串
    17             for(pos = 0; pos < len; pos++) {
    18                 //如果是'(',压栈
    19                 if(line.charAt(pos) == '(') {
    20                     s.push('(');
    21                 }
    22                 //如果是')'
    23                 else {
    24                     //如果栈非空,则从中弹出一个'(',匹配。因为每次都只压栈'(',所以弹出的一定是'('。
    25                     if(!s.isEmpty()) {
    26                         s.pop();
    27                     }
    28                     //如果栈空,则出现非法匹配,记录以下,并压栈'(',表示将')'变成'('。
    29                     //这里其实就是利用变换,而不是交换,来确定。
    30                     else {
    31                         flag = true;
    32                         s.push('(');
    33                     }
    34                 }
    35             }
    36             if(pos == len) {
    37                 //如果字符串完全括号匹配
    38                 if(!flag) {
    39                     //如果栈空,则说明完全匹配
    40                     if(s.isEmpty()) {
    41                         System.out.println("Yes");
    42                     }
    43                     //如果非空,则说明不能交换形成括号匹配
    44                     else {
    45                         System.out.println("No");
    46                     }
    47                 }
    48                 //如果字符串非法
    49                 else {
    50                     //如果最后栈里不是两个字符,则说明不能交换形成括号匹配,
    51                     if(s.size() != 2) {
    52                         System.out.println("No");
    53                     }
    54                     //如果最后栈里面只有两个字符'((',则说明可以进行交换一次,变为合法
    55                     else {
    56                         System.out.println("Yes");
    57                     }
    58                 }
    59             }
    60             else {
    61                 System.out.println("No");
    62             }
    63         }
    64     }
    View Code
  • 相关阅读:
    时间段内随机生成日期函数
    已知目标qps跟并发用户数20,压测平均响应时间实例
    并发数 = QPS*平均响应时间
    性能测试实战-XYB项目-内网访问
    linux安装jmeter
    word设置
    nginx安装【windows下安装】
    mac 修改权限为当前用户用户组
    兼容性测试
    linux 的一些命令
  • 原文地址:https://www.cnblogs.com/cing/p/8779345.html
Copyright © 2011-2022 走看看