• 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
  • 相关阅读:
    老年人微信教程手绘版|微信入门教程1
    微信网页版朋友圈在哪?怎么找不到
    如何用<dl>标签做表格而不用table标签
    600万个!520元的微信红包发了这么多!
    微信红包最高能发520元啦!只限今天!
    微信和WeChat的合并月活跃账户数达到7.62亿了
    excel隔行选中内容如何操作
    各大公司广泛使用的在线学习算法FTRL详解
    在线最优化求解(Online Optimization)之五:FTRL
    在线最优化求解(Online Optimization)之四:RDA
  • 原文地址:https://www.cnblogs.com/cing/p/8779345.html
Copyright © 2020-2023  润新知