普通遍历会超时 错误代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010;
int a[N];
int n,m;
int main()
{
string s;
cin>>n;
cin>>s;
cin>>m;
while(m--)
{
char op,om;
cin>>op>>om;
for(int i=0;i<s.size();i++)
{
if(op==s[i]) s[i]=om;
}
}
for(int i=0;i<s.size();i++) cout<<s[i];
}
之所以会超时 是因为 while循环里面又有一个for循环 执行m*n次很恐怖
利用辅助数组优化成 m*26
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010;
int a[N];
int n,m;
int main()
{
string s;
/*
因为每次实际上只动了a到z这几个字母
所以可以创建一个字符数组k先把a到z的每一个字母给记下来
那么比如s=atcoder s中的a就对应 k中的a
然后对k数组执行 m 次更改 比如 k中a变成了t 那么k[0]存的就是t
然后遍历一遍s数组 依次输出 s中字母所对应的下标在k中对应的值
*/
char k[26];//额外定义一个用来存a到z字符的数组
for(int i=0;i<26;i++)
{
k[i]=char('a'+i);
}
cin>>n;
cin>>s;
cin>>m;
while(m--)
{
char op,om;
cin>>op>>om;
for(int i=0;i<26;i++)
{
if(op==k[i]) k[i]=om;//
}
}
for(int i=0;i<s.size();i++)
cout<<k[s[i]-'a']; //s[i]-'a'表示s中相对于a而言每个字母对应的下标
}