首页 > 试题广场 >

括号闭合

[编程题]括号闭合
  • 热度指数:1240 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
判断由"()[]{}"6种括号组成的字符串是否合法
1. 所有括号必须闭合
2. 左括号必须在正确的位置闭合

输入描述:
由6种符号组成的字符串


输出描述:
合法则输出"true",不合法输出"false"
示例1

输入

(]

输出

false
示例2

输入

{[][()()]}

输出

true
示例3

输入

{([)]}

输出

false
function check(str) {
  const ary = [];
  const map = {
    '[': ']',
    '{': '}',
    '(': ')',
  };
  for(let v of str) {
    if(v === '['|| v === '{'|| v === '(') {
      ary.push(v);
    } else{
      if(map[ary.pop()] !== v) {
        return false;
      }
    }
  }
  if(ary.length === 0) {
    return true;
  }
  return false;
}
编辑于 2020-06-24 20:57:17 回复(1)
不利用其他函数,直接判断,简单容易理解
var str = readline();
var n = str.length;
var arr = [];
var j=0;
for(var i=0;i<n;i++){
    switch(str[i]){
        case '(':
            arr[j++] = '(';
            break;
        case '[':
            arr[j++] = '[';
            break;
        case '{':
            arr[j++] = '{';
            break;
        case ')':
            if(arr[j-1]=='('){
                j--;
            }else{
                i=n;//跳出
            }
            break;
        case ']':
            if(arr[j-1]=='['){
                j--;
            }else{
                i=n;//跳出
            }
            break;
        case '}':
            if(arr[j-1]=='{'){
                j--;
            }else{
                i=n;//跳出
            }
            break;
    }
}
if(j==0){
    console.log("true");
}else{
    console.log("false");
}


发表于 2020-08-13 14:48:42 回复(0)
1.利用 map 实现一一对应
2.利用栈
function IsValue(str) {
    let map = new Map([
        ['(',')'],
        ['{','}'],
        ['[',']']
    ])
    let stack = [];
    for(let i = 0 ; i < str.length ; i ++) {
        if(map.has(str[i])) { // 在左边
            stack.push(str[i])
        } else { // 在右边
            if(stack.length == 0) return false;
            let top = stack[stack.length - 1]; // 栈顶元素
            if(map.get(top) == str[i]) {
                stack.pop()
            } else {
                return false;
            }
        }
    }
    return true;
}

while(line = readline()) {
    var str = line;
    print(IsValue(str))
}

发表于 2020-02-05 02:48:38 回复(1)
JavaScript(Node) 😎题目:bilibili📺-括号闭合(map映射表+stack)
leetcode 20 valid [
//leetcode20  vaild []
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    ouput: process.stdout
})
let inArr = []
rl.on('line',line=>{
    if(!line) return
    inArr.push(line.trim())
    if(inArr.length === 1){
        let arr = inArr[0].split('')
        console.log(isValid(arr))

    }
})
var isValid = function(s) {
    let map = {
        '(':-1,
        ')':1,
        '{':-2,
        '}':2,
        '[':-3,
        ']':3
    }
    let stack = [] 
    for(let i=0;i < s.length;i++){ 
        if(map[s[i]] < 0){ 
            stack.push(s[i]) 
        }else { 
            let last = stack.pop() 
            if(map[last] + map[s[i]] != 0){ 
                return false
            }
        }
    }
    if(stack.length > 0) return false 
    return true 
};

发表于 2020-02-27 10:49:20 回复(0)
let l = [];
let check = (str) => {
    let flag = true;
    switch(str) {
        case '(':
        case '[':
        case '{':
        l.push(str);
        break;
        case ')': flag =  l.pop() === "(";break;
        case ']': flag =  l.pop() === "[";break;
        case '}': flag =  l.pop() === "{";break;
    }
    return flag;
}

let checkStr = (str) => {
    let flag = true;
    for(let i = 0, j = str.length; i < j; i++){
        if(!check(str.charAt(i))){
            flag = false;
            break;
        }
    }
    return flag;
}
发表于 2019-11-27 18:30:15 回复(0)
jks头像 jks
1
function fun(){
    var str = readline();
    var n = str.length;
    let map=new Map()
    let a=[]
    map.set('{','}')
    map.set('[',']')
    map.set('(',')')
    for(let i=0;i<n;i++){
        if(map.has(str[i])){
            a.push(str[i])
        }else{
            if(map.get(a.pop())!==str[i]){
                return false
            }
        }
    }
    if(a.length===0){
        return true
    }else {
        return false
    }
}
let res=fun()
console.log(res)

发表于 2022-02-18 16:04:55 回复(0)
就2ms
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#include<stack>

using namespace std;
int main()
{
    string s ;
    cin>>s;
    stack<char> st;
    //int coun1t = 1;
    if(s.length()%2!=0)
    {
        cout<<"false"<<endl;
    }
    else
    {
        for(int i = 0 ; i <s.length(); i++)
        {
            if(s[i] == '{' || s[i] == '(' || s[i] == '[')
            {
                st.push(s[i]);
            }
            else if(s[i] == '}')
            {
                if(st.top()=='{')
                {
                    st.pop();
                }
                else
                {
                    
                    cout<<"false"<<endl;
                    break;
                }

            }
            else if(s[i] == ']')
            {
                if(st.top()=='[')
                {
                    st.pop();
                }
                else
                {
                   
                    cout<<"false"<<endl;
                     break;
                }

            }
            else if(s[i] == ')')
            {
                if(st.top()=='(')
                {
                    st.pop();
                }
                else
                {
                   
                    cout<<"false"<<endl;
                     break;
                }

            }
        }

        if(st.empty()){
            cout<<"true"<<endl;
        }
    }

    return 0;

}


发表于 2021-08-23 16:00:13 回复(0)
const str = readline();

const test = (str) => {
    const regx = /(\(\))|(\[\])|(\{\})/g
    while (regx.test(str)) {
        str = str.replace(regx, '');
    }
    let res = str.length ? false : true;
    return res;
}
const result = test(str);
console.log(result);

 利用正则表达式把括号都消掉然后判断最后字符串的长度是否为0
发表于 2020-10-17 20:28:14 回复(0)
栈这个数据结构的入门题。
#include<iostream>
using namespace std;
int main(void)
{
    string s;
    cin >> s;
    int stack[10000];
    int top = -1;
    int mapper[10000];
    mapper[')'] = '(';
    mapper['}'] = '{';
    mapper[']'] = '[';
    for(int i = 0; i < s.length(); i++){
        if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
            stack[++top] = s[i];
        }
        else{
            if(stack[top] == mapper[s[i]]){
                top--;
            }else{
                cout << "false";
                return 0;
            }
        }
    }
    if(top == -1){
        cout << "true";
    }
    else{
        cout << "false";
    }
    return 0;
}


发表于 2020-09-20 23:50:05 回复(0)
var arr=readline().split("")
function yan(arr){
    let arr1=[];
    for(let i=0;i<arr.length;i++){
        if(arr[i]=='('||arr[i]=='['||arr[i]=='{'){
            arr1.push(arr[i])
            continue;
        } else if(arr[i].charCodeAt(0)-arr1[arr1.length-1].charCodeAt(0)<=2){
            arr1.pop();
            continue;
        }
    }
    if(arr1.length==0){
        return true;
    }else{
        return false;
    }
}
console.log(yan(arr))
发表于 2020-09-04 22:04:51 回复(0)
var lines = readline().split("")
var stack = []
let res
for(let i=0;i<lines.length;i++){
    if(lines[i] === "("||lines[i] ==="{" ||lines[i]==="["){
        stack.push(lines[i])
    }else{
        let temp = stack.pop()
        if(lines[i]===")"){
            if(temp!=="("){
                res = "false"
                 break
            }
        }
        if(lines[i]==="]"){
            if(temp!=="["){
                res = "false"
                 break
            }
        }
        if(lines[i]==="}"){
            if(temp!=="{"){
                res = "false"
                 break
            }
        }
    }
}
if(res==="false"){
    print("false")
}else{
    if(stack.length>0){
        print("false")
    }else{
        print("true")
    }
}

发表于 2020-09-04 15:45:37 回复(0)
var str=readline()
var obj={
    "{":"}",
    "[":"]",
    "(":")"
}
var arr=str.split("")
var stack=[]
stack.push(arr[0])
for(var i=1;i<arr.length;i++){
    var top=stack[stack.length-1]
    if(obj[top]==arr[i]){
        stack.pop()
    }else{
        stack.push(arr[i])
    }
}
if(stack.length==0){
    print(true)
}else{
    print(false)
}
发表于 2020-08-12 20:33:57 回复(0)
const readline = require('readline')
const rl = readline.createInterface({
    input:process.stdin,
    output: process.stdout
})
rl.on('line',line=>{
    print(compareStr(line))
})

function equal(c1,c2){
    if(c1=="("&&c2==")"){
        return true;
    }else if(c1=="{"&&c2=="}"){
        return true;
    }else if(c1=="["&&c2=="]"){
        return true;
    }else{
        return false;
    }

}

function compareStr(str){
    var newArr = [];
    if(str.length==0){
        return false
    }else if(str[0]==")"||str[0]=="}"||str[0]=="]"){
        return false;
    }
    for(let i = 0;i<str.length;i++){
        if(str[i]=="("||str[i]=="{"||str[i]=="["){
            newArr.push(str[i])
        }else if(str[i]==")"||str[i]=="}"||str[i]=="]"){
            if(newArr.length==0){
                return false;
            }else{
                if(newArr.length>0&&equal(newArr[newArr.length-1],str[i])){
                    newArr.pop();
                }else{
                    return false;
                }
            }
            
        }
    }
    return true;
}

我的问题到底出在哪,牛客上一直说语法问题,自己编译器可以正常输出
发表于 2020-07-26 11:32:39 回复(0)
记录左括号遇到的次序,匹配遇到右括号的次序

一个array,遇到左括号push, 遇到右括号如果匹配就pop,不匹配就return false,因为字符串只有括号字符,所以字符串遍历结束后array应该是空
发表于 2020-07-17 10:58:51 回复(0)

function cp(str1, str2) {
  if (str1 === "{" && str2 === "}") return true;
  if (str1 === "[" && str2 === "]") return true;
  if (str1 === "(" && str2 === ")") return true;
  return false;
}

function ***(str) {
  const stack = [];
  for (let i = 0; i < str.length; i++) {
    if (!cp(str[i], stack[0])) {
      stack.unshift(str[i]);
      continue;
    }
    stack.shift();
  }

  if (stack.length === 0) 
    return true;
  return false;
}

发表于 2020-07-01 00:17:37 回复(0)
let input = readline();
const unit = /(\{\}|\[\]|\(\))+/g;
let result = input.replace(unit, '');
while (result && input !== result) {
    input = result;
    result = input.replace(unit, '');
}
print(!result);


发表于 2020-05-11 16:16:28 回复(0)
function match(str) {
	let obj = {
		"{": "}",
		"[": "]",
		"(": ")"
	}
	
	let stack = [];
	
	for (let i = 0;i < str.length;i++) {
		if (str[i] == "{" || str[i] == "[" || str[i] == "(") {
			stack.push(str[i]);
		}else {
			if (str[i] != obj[stack[stack.length - 1]]){
				return false;
			}else {
				stack.pop();
			}
		}
	}
	
	if (stack.length == 0){
		return true;
	}else {
		return false;
	}
}

while (line = readline()) {
	var str = line;
	print(match(str));
}

原来牛客的js不能使用promot输入, 折腾了半天
大体思路是左括号进栈(用数组代替)遇到匹配的右括号出栈,不匹配return false,最后栈空判断所有左括号匹配
编辑于 2020-04-28 19:13:59 回复(0)
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner scanner=new Scanner(System.in);
        String line=scanner.nextLine();
        char left[]=new char[line.length()];
        int pos=0;
        boolean state=true;
        for(int i=0;i<line.length();i++) {
            if(!state)
                break;
            if(line.charAt(i)=='{'||line.charAt(i)=='['||line.charAt(i)=='(') {
                left[pos]=line.charAt(i);
                pos++;
            }
            else {
                char temp=line.charAt(i);
                    if(pos==0) {
                        state=false;
                        break;
                    }
                    if(check(left[pos-1], temp)) {
                        pos--;
                    }
                    else {
                        state=false;
                        break;
                    }
            }
        }
        if(state && pos==0)
            System.out.println("true");
        else
            System.out.println("false");
        
        scanner.close();
        
    }
    public static boolean check(char a,char b) {
        if(a=='{' && b=='}')
            return true;
        if(a=='[' && b==']')
            return true;
        if(a=='(' && b==')')
            return true;
        return false;
    }
}

发表于 2020-03-23 12:33:14 回复(0)
var arr=readline().split('');
var str_open=["(","[","{"];
var str_close=[")","]","}"];
var set=[];
function one(){
    for(var i=0;i<arr.length;i++){
        var o_index=str_open.indexOf(arr[i]);
        var c_index=str_close.indexOf(arr[i+1]);
        if(o_index!=-1){
            if(c_index!=-1&&c_index!=o_index){
                return'false'
            }
        }
        var s_i=set.indexOf(arr[i]);
        if(s_i!=-1){
            set[s_i]++;//数量+1
        }else{
            set[arr[i]]=1;//增加该键
        }
    }
    if(set["("]==set[")"]&&set["["]==set["]"]&&set["{"]==set["}"]){
        return'true'
    }else{
        return'false'
    }
}
print(one())
发表于 2020-01-12 23:16:34 回复(1)
def,不是Python吗,可这不是JS面试题吗
发表于 2019-12-10 02:09:48 回复(0)