我们可以用栈做。
首先如果字母 A 的数量或字母 B 的数量为奇数,那么不可能匹配。
维护一个栈,如果栈顶元素与当前元素相同那么弹出,否则就将这个元素扔进去,如果到最后栈是空的那么可以匹配。
结合样例 3 理解。
栈 stk 现在是空的(左边栈底,右边栈顶)。
第一个字符 A,扔进去,stk=A。
第二个字符 B,扔进去,stk=AB。
第三个字符 B,与栈顶元素相同,弹出栈顶,stk=A。
第四个字符 A,与栈顶元素相同,弹出栈顶,stk 内无元素。
第五个字符 B,扔进去,stk=B。
第六个字符 B,与栈顶元素相同,弹出栈顶。
栈内无元素,所以可以成功配对。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<bits/stdc++.h> using namespace std; int n,ans; string s; bool florr(){ cin>>s; int ca=0,cb=0; for(int i=0;i<s.size();i++)if(s[i]=='A')ca++;else cb++; if(ca%2||cb%2)return 0; stack<int> stk; for(int i=0;i<s.size();i++){ if(stk.size()&&stk.top()==s[i])stk.pop(); else stk.push(s[i]); } return stk.empty(); } int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; while(n--)ans+=florr(); cout<<ans<<"\n"; return 0; }
|