检查c ++中的有效括号

时间:2017-02-20 09:00:19

标签: c++

给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。

括号必须以正确的顺序关闭,“()”和“()[] {}”都有效,但“(]”和“([]]”不是。

一次又一次失败......对于输入应该返回true - “()[] {}”---但它返回false ...

class Solution {
public:
    bool isValid(string s) {
        map<char,char>m;
        m['(']=')';
        m['{']='}';
        m['[']='}';int i;string c="";int j;
        for(i=0;i<s.length();i++){
            if((s[i]=='(')||(s[i]=='{')||(s[i]=='[')){
               c=c+(s.at(i));
            }else if((s[i]==')')||(s[i]=='}')||(s[i]==']')){
                j=c.length();
                if(j==0){
                    return false;
                }
                if(m[c[j-1]]!=s[i]){
                    return false;
                }else{
                  c= c.substr(0,j-1);
                }
            }
        }
        if(c.length()){
            return false;
        }
        return true;
    }
};

3 个答案:

答案 0 :(得分:0)

以下是使用堆栈执行此操作的方法:

#include <iostream>
#include <vector>

class Solution {
public:
  bool isValid(std::string s) {
    std::vector<char> stk;
    for (char c : s) {
      switch (c) {
      case '(':
      case '{':
      case '[':
        stk.push_back(c);
        break;
      case ')':
        if (stk.empty() || stk.back() != '(')
          return false;
        stk.pop_back();
        break;
      case '}':
        if (stk.empty() || stk.back() != '{')
          return false;
        stk.pop_back();
        break;
      case ']':
        if (stk.empty() || stk.back() != '[')
          return false;
        stk.pop_back();
        break;
      }
    }
    return stk.empty();
  }
};

int main()
{
  Solution tester;
  std::cout << std::boolalpha << tester.isValid("asdf(as[x]df)") << "\n";
  std::cout << std::boolalpha << tester.isValid("asdf(as[x}df)") << "\n";
}

输出

true
false

答案 1 :(得分:0)

当我从LeetCode处理此问题时,我遇到的问题是引入了一些边缘情况(如“]”)。在这些情况下,常规堆栈方法(根据我的逻辑)失败了,因为顶部没有任何东西,所以我想出了这个

class Solution
{
public:
  bool isValid(string s)
  {
    stack<char> s1;
    s1.push('I');
    for(int i = 0; i< s.length(); i++)
    {
        if( s[i] == '(' || s[i] == '{' || s[i] == '[' )
            s1.push(s[i]);

        else if
        (
            (s1.top() == '(' && s[i] == ')') ||
            (s1.top() == '{' && s[i] == '}') ||
            (s1.top() == '[' && s[i] == ']')
        )
        s1.pop();
        else 
            s1.push(s[i]);
    }
    if(s1.size() == 1)
        return true;
    return false;
   }
};

答案 2 :(得分:-3)

我认为我们可以为这种情况应用非常简单的算法,除非您必须做其他事情。

bool isValid(string s) {
   bool isvalid = true;
   for(int i = 0; i < s.length() ; i++ ) {

   if((s[i] == '(' && s[i+1] ==')') || 
       (s[i] == '{' && s[i+1] =='}') || 
       (s[i] == '[' && s[i+1] ==']'))
     continue;

    isvalid = false;
    break;
   }
 return isvalid;
}