AcWing 5996. 回文字符串(STL里常见的字符串处理)
原题链接
中等
码字不易,点个赞吧QWQ
想系统学习STL中字符串处理的uu可以参考这篇博客
https://www.cnblogs.com/ACMLOVER/p/17978803#substr%28pos%2C%20len%29%3A%20%E8%BF%94%E5%9B%9E%E4%BB%8E%E6%8C%87%E5%AE%9A%E4%BD%8D%E7%BD%AE%E5%BC%80%E5%A7%8B%E7%9A%84%E6%8C%87%E5%AE%9A%E9%95%BF%E5%BA%A6%E7%9A%84%E5%AD%90%E4%B8%B2%EF%BC%9A
关于本题,思路如下:
任意字符串都可以拆成ABC三部分,A,C两部分是只由l,q,b组成的最长前缀字符串和最长后缀字符串
分以下情况讨论:
1.如果字符串仅有l,q,b组成,显然可行
2.看B部分,如果B部分不回文,那一定无法构成
3.如果B部分是回文字符串,那看A前面能否添一些字符构成C
那只要检验A的序列和C的前缀序列是否相等即可
可能会有点绕,建议uu们自己举例,便于理解(^▽^)
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int T;
int main(){
cin>>T;
string s;
for(int i=1;i<=T;i++){
cin>>s;
int l,r; //我们要把ABC这个分界点找到,l为左端点,r为右端点
for(r=s.size()-1;r>=0&&(s[r]=='l'||s[r]=='q'||s[r]=='b');r--);
if (r<=0) cout<<"Yes"<<endl; //字符串仅有l,q,b字符,Yes
else{
for(l=0;l<r&&(s[l]=='l'||s[l]=='q'||s[l]=='b');l++);
string tmp = s.substr(l,r-l+1); //把B部分拿出来
reverse (tmp.begin(),tmp.end()); //通过翻转后是否一样来判断回文
if (tmp!=s.substr(l,r-l+1)) cout<<"No"<<endl;
else {
for(;l>=0&&r<=s.size()&&s[l]==s[r];l--,r++); //看一下A的序列是否和C前缀一样
if (l==-1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
return 0;
}