目录
2.字符串处理1
3.总结
1.括号序列
给定一个长度为 nn 的字符串 ss,字符串由 (
, )
, [
, ]
组成,问 ss 是不是一个合法的括号序列。
合法的括号序列的定义是:
-
空串是一个合法的括号序列。
-
若
A
是一个合法的括号序列,则(A)
,[A]
也是合法的括号序列。 -
若
A
,B
都是合法的括号序列,则AB
也是合法的括号序列。
输入格式
第一行一个整数 nn。
接下来一行一个长度为 nn 的字符串 ss 。
输出格式
如果 ss 是合法的括号序列,输出 Yes
,否则输出 No
。
样例输入1
10
[]([(())])
样例输出1
Yes
样例输入2
4
[(])
样例输出2
No
数据规模
对于所有数据,保证 n≤100000n≤100000
思路:只需要注意刚开始的位置是否存在右括号,如果存在就不成立。
完整代码:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef vector<int> vi;
//#define int long long
#define fir first
#define sec second
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)x.size()
#define rep(i, l, r) for (int i = l; i <= r; ++i)
#define repd(i, l, r) for (int i = l; i >= r; --i)
#define pb push_back
const int N=2e5+10;
char s[N];
vector<char>v;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin>>n;
cin>>s+1;
bool ok=true;
if(s[1]==']'||s[1]==')')
{
cout<<"No"<<endl;
return 0;
}
rep(i,1,n)
{
if(s[i]=='(' || s[i]=='[')
{
v.pb(s[i]);
}
else if(s[i]==']')
{
int l=v.size();
if(v[l-1]=='[')
{
v.erase(v.begin()+l-1);
}
else
{
ok=false;
}
}
else if(s[i]==')')
{
int l=v.size();
if(v[l-1]=='(')
{
v.erase(v.begin()+l-1);
}
else
{
ok=false;
}
}
}
if(!ok||v.size())cout<<"No"<<'\n';
else cout<<"Yes"<<'\n';
return 0;
}
2.字符串处理1
给定一个长度为nn的字符串ss,字符串由小写字母a..z
组成。
小明来对这个字符串进行操作,他会从头到尾检查这个字符串,如果发现有两个相同的字母并排在一起,就会把这两个字符都删掉。小明会重复这个操作,直到没有相邻的相同字母。
你需要给出处理完成的字符串。
输入格式
第一行一个整数nn。
接下来一行一个长度为nn的字符串ss。
输出格式
输出最后处理完成的字符串,有可能是空串。
样例输入1
9
acccabddb
样例输出1
aca
样例输入2
5
ababa
样例输出2
ababa
数据规模
对于所有数据,保证n≤100000
思路:只需要注意查的时候是用下标访问的,下标的处理用size来写,记得减一,第几个也要减一;删的时候是用小括号()来删的,并且传入的是begin这种东西,记得减一。
完整代码:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef vector<int> vi;
//#define int long long
#define fir first
#define sec second
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)x.size()
#define rep(i, l, r) for (int i = l; i <= r; ++i)
#define repd(i, l, r) for (int i = l; i >= r; --i)
#define pb push_back
const int N=2e5+10;
char s[N],a[N];
vector<char>v;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin>>n;
cin>>s+1;
rep(i,1,n)
{
int len=v.size();
if(v.empty() || v[len-1]!=s[i])
{
v.pb(s[i]);
}
else if(v[len-1]==s[i])
{
v.erase(v.begin()+len-1);
}
}
for(auto x:v)
{
cout<<x;
}
return 0;
}
总结:
vector可以模拟任何单个的STL(如:栈,队列),但不要去模拟map,set这样双个值得STL。
vector通吃