给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。
括号必须以正确的顺序关闭,“()”和“()[] {}”都有效,但“(]”和“([]]”不是。
一次又一次失败......对于输入应该返回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;
}
};
答案 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;
}