京东2018秋招笔试题之牛牛的括号匹配

版权声明:博主GitHub网址https://github.com/29DCH,欢迎大家前来交流探讨和fork。 https://blog.csdn.net/CowBoySoBusy/article/details/82054590

完整的题目描述不太好找,这里就简单讲一下题目的大概含义,然后给出代码详解。

题目的主要意思是:合法的括号匹配序列要求每一个左括号都必须要有一个右括号与之完成配对,像“(((())”和"()((()"就不是合法的,而"((()))","()()()"就是合法的序列.现求是否能通过一次变换将不合法的序列转变成合法的序列.

输入输出我就不举例了,直接进入代码吧.

知识点:很明显可以借助单调栈或者字符操作来完成这个程序题的设计

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char str[maxn];
stack<char> s;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        while(!s.empty())
            s.pop();
        scanf("%s",str);
        int n=strlen(str);
        if(n==2)
        {
            if(str[0]=='('&&str[1]==')')
            {
                puts("No");
                continue;
            }
        }
        int i;
        int flag1=0;
        for(i=0; i<n; i++)
        {
            if(str[i]=='(')
            {
                s.push('(');
            }
            else
            {
                if(!s.empty())
                    s.pop();
                else
                {
                    if(flag1)
                        break;
                    flag1=1;
                    s.push('(');
                }
            }
        }
        if(i==n)
        {
            if(!flag1)
            {
                if(s.empty())
                    puts("Yes");
                else puts("No");
            }
            else
            {
                if(s.size()!=2)
                    puts("No");
                else puts("Yes");
            }
        }
        else puts("No");
    }
    return 0;
}
package test;

import java.util.*;

/**
 * 牛牛的括号匹配
 */
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        while (N--) {
            String s = in.next();
            char[] chars = s.toCharArray();
            System.out.println(check(chars) ? "Yes" : "No");
        }
    }

    private static boolean check(char[] chars) {
        int lCnt = 0, rCnt = 0;
        for (char c : chars) {
            if (c == '(') lCnt++;
            else rCnt++;
        }
        if (lCnt != rCnt) return false;
        for (int i = 1; i < chars.length; i++) {
            for (int j = 0; j < i; j++) {
                swap(chars, i, j);
                if (isPalindrome(chars)) return true;
                swap(chars, i, j);
            }
        }
        return false;
    }

    private static boolean isPalindrome(char[] chars) {
        int cnt = 0;
        for (char c : chars) {
            if (c == '(') cnt++;
            else {
                if (cnt <= 0) return false;
                cnt--;
            }
        }
        return cnt == 0;
    }

    private static void swap(char[] chars, int i, int j) {
        char t = chars[i];
        chars[i] = chars[j];
        chars[j] = t;
    }
}

猜你喜欢

转载自blog.csdn.net/CowBoySoBusy/article/details/82054590