@
目录
1、判断括号是否匹配(只有小括号())
1.1、不成功版,只判断了括号数量是否相等
题目:给你一个字符串,判断字符串中的括号是否匹配,意思就是一个左括号要对应一个右括号,即'('
和')'
必须成对出现。那不就是判断字符串里面的'('
和')'
数量是不是相等吗,这个简单呀,用stl算法里面的count()
函数;开撸
#include<iostream>
#include<string>
#include <algorithm>
using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::count;
int main()
{
string input;
getline(cin, input);
int leftParenthesisNumber = 0, rightParenthesisNumber = 0;
leftParenthesisNumber = count(input.begin(), input.end(), '(');
rightParenthesisNumber = count(input.begin(), input.end(), ')');
if (leftParenthesisNumber == rightParenthesisNumber) {
cout << "YES" << endl;
}else {
cout << "NO" << endl;
}
return 0;
}
然后一看,部分通过。错误用例((1+2)+1))(
,enmmm。一看就晓得出啥问题了,左括号和右括号数量是匹配了可是位置不对呀。看来要换种方法了。
1.2、成功版,真正判断了括号是否匹配(位置和数量)
#include<iostream>
#include<string>
#include <algorithm>
using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::count;
int main()
{
string input;
getline(cin, input);
int num=0;
for (int i = 0; i < input.length(); i++) {
if (input[i] == '(') {
num++;
}else if (input[i] == ')') {
num--;
}
if (num < 0) { //num<0 说明出现右括号数量大于左括号了,位置不匹配。直接不合格输出 NO
cout << "NO" << endl;
break;
}
}
if (num == 0) {
cout << "YES" << endl;
}else if (num > 0) { //num>0 说明出现右括号数量小于左括号了,数量不匹配 输出 NO
cout << "NO" << endl;
}
return 0;
}
基本思想是从开头往后找,找到一个左括号,括号数加一,找到一个右括号,认为可以对消一对括号,即括号数减一。一旦有括号数小于0,则代表找到这个位置右括号数量大于左括号了,肯定不对了,直接完成搜索。如果找到最后都没有括号数小于0的情况,那么看括号数是多少,为0 说明左右正好对消,满足条件,大于0,说明左括号多了,不满足情况。
2、字符串中有三种括号 ‘(’,’)’,’{’,’}’,’[’,’]’时的判断(利用栈)
假如括号字符串中有 '(',')','{','}','[',']' 来判断是否是有效括号。左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
bool isValid(string s) {
stack<char> myStack;
for(int i=0;i<s.size();i++){
if(isLeftParenthesis(s[i])){ //判断这个字符是不是左括号,保证栈里面全是左括号
myStack.push(s[i]);
}
else{ //到这儿,这个括号已经是右括号了
if(myStack.empty() || (myStack.top()!=s[i]-1 && myStack.top()!=s[i]-2)){
/*这个括号已经是右括号了,而且栈里面都空了,那肯定不匹配(因为没有右括号开头的括号嘛)
那如果栈没空,那么就要判断栈顶的左括号和现在这个右括号是否匹配了
‘(’与‘)’ASCII值差1,'['与']ASCII值差2,'{'与'}'ASCII值也差2*/
return false;
}
myStack.pop();
}
}
return myStack.empty();
}
bool isLeftParenthesis(char c){ //判断是不是左括号
return (c=='('||c=='['||c=='{');
}