题目详情
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
——题目难度:简单
C++栈、哈希表解题代码(有注释)
class Solution {
public:
bool isValid(string s) {
unordered_map<char, int> mp{{'(', 1}, {'[', 2}, {'{', 3},
{')', 4}, {']', 5}, {'}', 6}};
stack<char> st;
bool istrue = true; //注意空字符串可被认为是有效字符串
for(char c : s) {
int temp = mp[c];
if (temp >= 1 && temp <= 3) st.push(c); //当出现左括号时,将其加入栈中
else if (!st.empty() && mp[st.top()] == temp - 3) st.pop(); //当出现右括号时,一定要和栈顶字符相匹配,匹配后则移除栈顶元素
else { istrue = false; break; } //出现右括号时,不和栈顶字符相匹配,则说明该字符串无效
}
if (!st.empty()) istrue = false; //如果栈不为空,则说明还有剩余的左括号没有被匹配
return istrue;
}
};
C语言解题代码
bool isValid(char * s){
int geshu=0,i,count=0,key=1; //key来防止像全是"))))"这些情况
for( ;s[geshu]!='\0';geshu++);
if(geshu==0) //处理空字符串
return true;
char *cp = (char *)malloc(sizeof(char)*(geshu+1)); //开辟足够空间 特殊情况,如"["而下面要用到cp[1],所以得+1
memset(cp,0,geshu+1);
for(i=0;i<geshu;i++)
{
if((s[i]=='(')||(s[i]=='{')||(s[i]=='[')){
count++;
cp[count]=s[i];
key=0;
}else if((s[i]==cp[count]+1)||(s[i]==cp[count]+2))
{
count--;
}else //这里相当于在没有出现 '('或者'['或者'{' 的情况下,出现了没有与前面相对应的 ')'或者']'或者'}' ,那这肯定false的.
return false;
}
free(cp);
if( (count)||(key) ){
return false;
}
return true;
}