codeforces 解题报告 1006D. Two Strings Swaps 分类讨论

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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值