链接: link.
可以使程序优化,减少程序时间复杂度的方法有很多,对于每道题都可能有独到的方法,对于这道题,可以用成对的不合法的字符数量来表示当前字符串是否合法,就避免了每次改变一个字符都需要遍历整个字符串,大大降低了时间复杂度
当成对的不合法的字符数量==0时,字符串当前合法;
否则,当前字符串不合法;
所以在改变字符前先提前统计好成对的不合法的字符数量res,在此基础上每一次修改一个字符时,只需要考虑res变化后的结果
还有一个易错点是:当修改的字符所对应的字符是自己时,他修改后res数量不会变化
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int q,res=0;
string s;
cin>>s;
int len=s.size();
int l=0,r=len-1;
while(l<=r){
if(s[l]!=s[r]) res++;
l++;
r--;
}
cin>>q;
while(q--){
int x;
char c;
cin>>x>>c;
if(x-1==len-x);
else if(s[x-1]==s[len-x]&&c!=s[len-x]) res++;
else if(s[x-1]!=s[len-x]&&c==s[len-x]) res--;
if(res==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
s[x-1]=c;
}
}