题目描述
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);
}
}