2024届美团第一次笔试第二题

题目描述

2.

小美的字符串匹配度

小美有两个长度为n只包含小写字母的字符串s和t,小美定义“两个字符串的匹配度”为i∈[1,n]中si​=ti​的数量,例如"abacd"和"aabdd"的匹配度就是2。

现在你可以进行最多一次以下操作:
对于字符串t,选择两个索引i,j(1≤i<j≤n),交换ti​和tj​。

小美想知道,s和t的最大字符串匹配度是多少?

输入描述

第一行输入一个整数n
第二行输入一个长度为n的字符串s。
第三行输入一个长度为n的字符串t。

输出描述

输出一个整数,s和t的最大匹配度。

示例1

输入例子:

5
ababc
babac

输出例子:

3

解题思路

        本题的大体思路是贪心算法。先对两个字符串s和t扫描一遍,如果在相同索引下s对应的字符和t对应的字符一样,那么sum加1,并且分别删除这个相同的字符。

        (提示:此处应该对照我的代码阅读)

        然后剩下的s和t在相同索引下的字符一定不一样。采用双层for循环,第一层for循环的变量为i第二层为k(巧妙运用for循环的写法可以让i一定比k小),然后分别比较a1[i]和a2[k],a2[i]和a1[k]。

易错点

1.while循环里数组向前挪一位的时候m不要加,否则会漏掉这一位没判断

2.很可能在某些情况下super_sum一定更改为2了,但是由于后续的遍历让super_sum有更改为1了,因此每次super_sum的更改都需要增加一个取最大值的情况

代码

import java.util.Scanner; 

import java.lang.String;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String s1 = in.next();
        String s2 = in.next();
        int sum = 0;
        char[] a1 = s1.toCharArray();
        char[] a2 = s2.toCharArray();
        int l = a1.length;
        int m = 0;
        while(m < l){
            if(a1[m] == a2[m]){
                sum+= 1;
                int j = 0;
                for(j = m + 1;j<l;j++){
                    a1[j - 1] = a1[j];
                    a2[j - 1] = a2[j];
                }
                a1[j - 1] = 0;
                a2[j - 1] = 0;
                l = l - 1;
            }
            else{
                m++;
            }
        }
        int super_sum_l = 0;
        int super_sum_r = 0;
        int super_sum = 0;
        for(int i = 0;i<l;i++){
            for(int k = i;k < l;k++){
                if(a1[i] == a2[k]){
                    super_sum = 1 > super_sum ? 1:super_sum;
                }
                if(a2[i] == a1[k]){
                    super_sum = 1 > super_sum ? 1:super_sum;
                }
                if(a1[i] == a2[k] && a2[i] == a1[k]){
                    super_sum = 2 > super_sum ? 2 : super_sum;
                }
            }
        }
        System.out.println(sum + super_sum);

    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值