给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
知识点
字符串知识点:string s:常见操作方法;
解题思路
解法一:栈配对法 ;这是一个有技术含量的算法
定义res作为一个栈
遍历整个字符串,将每个左括号加入res
当发现右括号时,就查栈顶元素:
若不是其对应的左括号,直接返回false;
若是,该元素出栈,检查字符串中下一个元素;
class Solution {
public:
bool isValid(string s) {
// 使用栈 配对法 栈是属于算法层次
vector<char> ans={'?'}; // vector容器即可当做一个栈空间,?只是来压栈第一个字符
int i ; // 定义循环变量
int len=s.length(); // 字符串长度
char c = s[0]; // 移动接收字符串
char cc; //接收栈顶元素
if(len%2==1){
return false;
}
for(i=0;i<len;i++){
c=s[i];
if(c==']' || c=='}'||c==')'){
cc=ans.back(); // 取出栈顶元素
if(cc==c-1||cc==c-2) { // 在ASC中相对扩韩要么相差1,要么相差2
ans.pop_back(); // 删除栈顶元素
} else{
return false;
}
}else{
ans.push_back(c);
}
}
if(ans.back()=='?'){
return true;
}
else{
return false;
}
}
};
哈希表法
如果 c 是左括号,则入栈 pushpush;
否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 falsefalse。
class Solution:
def isValid(self, s: str) -> bool:
dic = {'{': '}', '[': ']', '(': ')', '?': '?'}
stack = ['?']
for c in s:
if c in dic: stack.append(c)
elif dic[stack.pop()] != c: return False
return len(stack) == 1
小结
既然要做这件事情,就要付出认真的态度来对待,不要幻想再看一遍,只是自我安慰而已;第一次就要努力做到最好;