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

题目描述

2.

小美的字符串匹配度

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

现在你可以进行最多一次以下操作:
对于字符串t,选择两个索引i,j(1≤i
小美想知道,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 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);

    }
}

你可能感兴趣的:(java刷题,算法,算法)