题目大意:给定两个字符串,长度相等,定义距离为不同字符的个数,问选择s中任意两个字符,调换位置后能得出的最小距离。
#include <iostream>
#include <cstdio>
using namespace std;
char s[200010],t[200010];
bool is[26][26]={false};
int ps[26][26];
int main()
{
int n,ans=0;
scanf("%d",&n);getchar();
scanf("%s%s",s,t);
for(int i=0;i<n;i++) if(s[i]!=t[i]){
int x=s[i]-'a',y=t[i]-'a';
is[x][y]=true;// 将字符串抽象为图,只需记录不同字母组合间是否存在边即可
ps[x][y]=i+1;// 记录边对应字符串中的位置
ans++;
}
// 先检验是否可以通过互换减少2个距离
for(int i=0;i<26;i++)
for(int j=0;j<26;j++) if(is[i][j]&&is[j][i]){
cout<<ans-2<<endl;
cout<<ps[i][j]<<" "<<ps[j][i]<<endl;
return 0;
}
// 在检验能否减少1个距离
for(int i=0;i<26;i++)
for(int j=0;j<26;j++) if(is[i][j]){
for(int k=0;k<26;k++) if(is[j][k]){
cout<<ans-1<<endl;
cout<<ps[i][j]<<" "<<ps[j][k]<<endl;
return 0;
}
}
cout<<ans<<endl;
cout<<-1<<" "<<-1<<endl;
return 0;
}