UVa673

UVa673

題敘

http://domen111.github.io/UVa-Easy-Viewer/?673
給一個只包含 ( ) [ ] 的字串
定義合法的字串需要符合以下任一條件

  1. 字串為空字串
  2. 如果 $A$ 和 $B$ 都為正確的運算式,則 $A B$ 也為正確的運算式,
  3. 如果 $A$ 為正確的運算式,則 $(A)$ 及 $[A]$ 都為正確的運算式。
    求該字串是否為合法字串

想法

如果括號要能匹配的話,必定會兩者相鄰,例如 () 或是 []
那麼,我們只需要一找到匹配的括號就消除,最後如果還有剩餘就是不合法字串,否則為合法字串
利用stack的特性可以簡單地完成

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//By Koios1143
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
int t;
string s;
stack<char>st;
int main(){
cin>>t;
getchar();
while(t--){
getline(cin,s);
while(!st.empty())
st.pop();
for(int i=0 ; i<s.size() ; i++){
if(s[i] == '(' || s[i] == '[')
st.push(s[i]);
else{
if(st.empty()){
st.push(s[i]);
}
else if(st.top()=='(' && s[i]==')'){
st.pop();
}
else if(st.top()=='[' && s[i]==']'){
st.pop();
}
else{
st.push(s[i]);
}
}
}
if(st.empty())
cout<<"Yes\n";
else
cout<<"No\n";
}

return 0;
}

複雜度

掃過一次字串即可,每次複雜度為 $O(len(s))$
總複雜度 $O(tlen(s))$