问题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解决:
思想:
思想很简单,就是使用栈,将字符串中的元素依次压入栈中,在压入栈的过程中,比较栈中最后两个符号是否可以匹配。如果可以匹配就将这两个符号弹出栈。最后如果栈中没有元素,则代表原来的字符串是有效的,否则无效。
python代码:
class Solution:
def isValid(self, s: str) -> bool:
if(len(s)==0):
return True
direc={'(':')','{':'}','[':']'}
str_list=[s[0]]
for i in range(1,len(s)):
str_list.append(s[i])
# if(s[i-1] not in direc[s[i-1]]):
# continue
if(len(str_list)<2):
continue
if(str_list[-2] not in direc):
continue
if(direc[str_list[-2]]==str_list[-1]):
str_list=str_list[0:-2]
if(len(str_list)==0):
return True
else:
return False
c++代码:
class Solution {
public:
bool isValid(string s) {
if(s.empty())
return true;
map<string,string> valid_direc={{"(",")"},{"(",")"},{"[","]"}};
string origined=s.substr(0,1);
string remained=s.substr(1,s.size()-1);
for(auto c:remained)
{
origined+=c;
if(origined.size()<2)
continue;
if(valid_direc.count(origined.substr(origined.size()-2,1))==0)
continue;
if(valid_direc[origined.substr(origined.size() - 2,1)] == origined.substr(origined.size() - 1,1))
{
origined=origined.substr(0,origined.size()-2);
}
}
if(origined.size()==0)
return true;
else
return false;
}
};