“()” “[]”问题

试题描述
有一个仅由“(”、“)”、“[”、“]”组成的字符串S。下面规定怎样的字符串是合法的:
1. 空串是合法的。
2. 若字符串A是合法的,则字符串[A]、(A)都是合法的。
3. 若字符串A、B都是合法的,则字符串AB是合法的。
例如[]、([])、()[[]]都是合法的,而([)]、((]))是不合法的。
给定字符串S,判断它是否合法。
 
输入
输入文件包含多组测试数据。
第一行,一个整数T,表示测试数据的组数。
接下来的T行,每行一个字符串,表示你需要判断的字符串S。
输出
对于每个给定的字符串,输出一行,若它是合法的,则输出“Yes”,否则输出“No”。
输入示例
2
([])
([)]
输出示例
Yes
No
其他说明
1<=T<=50,字符串长度不超过50。

C程序:

#include <cstdio>
#include <cstring>

char s[60];
int len;

bool kh(int start, int end){
     if(start > len || end > len){
        return true;
     }
     if(start > end){
        return true;
     }
     if(start + 1 == end && (s[start] == '(' && s[end] == ')') || (s[start] == '[' && s[start] == ']')){
        return true;
     }
     for(int i = start + 1; i <= end; ++i){
        if((s[start] == '(' && s[i] == ')') || (s[start] == '[' && s[i] == ']')){
           if(kh(start + 1, i - 1) && kh(i + 1, end)){
              return true;
           }
        }
     }
     return false;
}

int main(){
    int n;
    scanf("%d", &n);
    for(int k = 1; k <= n; ++k){
       scanf("%s", s);
       len = strlen(s) - 1;
       if(kh(0, len)){
          printf("Yes\n");
       }else{
          printf("No\n");
       }
       memset(s, 0, sizeof(s));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/WHYFRANK/p/4717683.html