首先对输入的两个字符比较,相等就不用处理,如果不相等就进行两次映射
这里有两张映射表,map1 用来存储某个字符映射到哪个字符了,比如 map1[ a ] = h ,说明字符 a 被替换成字符 h 了;
map2 用来存储某个字符是由哪个字符映射而来,比如 map2[ a ] = h,说明字符 a 是由字符 h 映射而来。
简单说这两张映射表一个存储去向,一个存储来源。
再然后就是对 m 个替换字符对进行处理了,处理完之后对源字符串进行一次替换就行。
处理的过程是这样的,假如输入的两个字符为 ch1 和 ch2 ,
首先把 ch1 变成 ch2 ,也就是说 要把ch1 的来源字符的去向变成 ch2, 举个例子, a 已经变成 b,现在又要把b 又变成 c,则相当于把 a 变成 c,因为 b 的来源字符是 a,然后要把这个来源字符 a 的去向变成 c,就成功地把 a 变成 c 了。
把 ch2 变成 ch1 进行同样的处理,即把 ch2 的来源字符的去向变成 ch1
最后交换彼此的来源映射表。代码如下:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<char,char> map1,map2;
int n,m,i,j,temp;
for(i=0;i<26;++i)
map1[i+'a']=map2[i+'a']=i+'a';
cin>>n>>m;
string str;
cin>>str;
char ch1,ch2;
for(i=0;i<m;++i)
{
cin>>ch1>>ch2;
if(ch1!=ch2)
{
map2[map1[ch1]] = ch2; //把 ch1 的来源字符的去向变成 ch2
map2[map1[ch2]] = ch1; //把 ch2 的来源字符的去向变成 ch1
// 交换来源表
temp = map1[ch1];
map1[ch1] = map1[ch2];
map1[ch2] = temp;
}
}
for(i=0;i<n;++i)
str[i] = map2[str[i]];
cout<<str;
return 0;
}