http://codeforces.com/contest/1006/problem/D
解题思路:
1.按照题目要求对字符串进行分割,分组讨论,每组得到四个字符,例如:上面串的第一个和最后一个,下面串的第一个和最后一个。
2.分类讨论:
-
一组字符中存在两对相等字符的情况则不需要替换操作
-
一组字符中上面两个与下面两个至少存在一对相等字符的情况,那么只需要修改上面的一个就能获得两对相等字符了
-
一组字符中上面两个与下面两个完全不同:若下面两个字符相等,那么上面只需要修改一个就能获得两对相等字符;否则上面就得修改两个字符才能获得两对字符
3.最后判断串长是否为奇数,是的话判断上下中间字符是否相等,不相等就需要修改上面的
import java.util.Scanner;
import java.util.Vector;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String str1 = sc.nextLine();
String str2 = sc.nextLine();
int ans = 0;
for(int i = 0;i < n / 2;i++) {
int left = i,right = n - i - 1;
Vector<Character> ve = new Vector<>();
ve.clear();
ve.add(str1.charAt(left));
ve.add(str1.charAt(right));
ve.add(str2.charAt(left));
ve.add(str2.charAt(right));
if(ve.get(0) == ve.get(1) && ve.get(2) == ve.get(3)) ; //存在两对字符的
else if(ve.get(0) == ve.get(2) && ve.get(1) == ve.get(3)); //存在两对字符的
else if(ve.get(0) == ve.get(3) && ve.get(1) == ve.get(2)); //存在两对字符的
//上面串的两个字符存在和下面其中一个字符相等,那么只需要改变上面的其中一个字符即可
else if(ve.get(0) == ve.get(2) || ve.get(0) == ve.get(3) || ve.get(1) == ve.get(2) || ve.get(1) == ve.get(3))
ans++;
//上面串和下面串完全不同
else if(ve.get(0) != ve.get(2) && ve.get(0) != ve.get(3) && ve.get(1) != ve.get(2) && ve.get(1) != ve.get(3)) {
if(ve.get(2) == ve.get(3)) //如果下面串相等,那么上面串只需要修改任意一个,使得上面相等即可
ans++;
else ans += 2; //上下完全没有关系,下面自己也没有关系,那上面两个都得改
}
}
if(n % 2 == 1) {
if(str1.charAt(n / 2) != str2.charAt(n / 2))
ans++;
}
System.out.println(ans);
}
}