一、题目描述
给定由[a-z] 26 个英文小写字母组成的字符串 A和 B,其中A中可能存在重复字母,B 中不会存在重复字母,现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。
挑选规则如下:
- 同一个位置的字母只能被挑选一次;
- 被挑选字母的相对先后顺序不能改变;
求最多可以同时从 A 中挑选多少组能组成B 的字符串。
二、输入描述
输入为 2行,第 1行输入字符串 A,第 2 行输入字符串 B,行首行尾无多余空格,其中 A、B 均由[a-z] 26 个英文小写字母组成。
- 0<A.length<100,A 中可能包含重复字母;
- 0<B.length<10,B 中不会出现重复字母;
三、输出描述
输出 1 行,包含 1个数字,表示最多可以同时从 A 中挑选多少组能组成 B 的字符串,行末无多余空格。
无需验证输入格式和输入数据合法性。
四、Java算法源码
/**
* 从字符串 A 中按规则挑选一些字母 组成字符串 B。
*
* 同一个位置的字母只能被挑选一次;
* 被挑选字母的相对先后顺序不能改变;
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 可能存在重复字母的字符串A
String a = sc.nextLine();
// 不存在重复字母的字符串B
String b = sc.nextLine();
char[] arrA = a.toCharArray();
char[] arrB = b.toCharArray();
int count = 0;
int i = 0;
int j = 0;
while (i < a.length()) {
if (arrA[i] == arrB[j]) {
// 已经匹配的置为*,表示无法复用
arrA[i] = '*';
// 能匹配对应的字符,子串指针后移
j++;
}
//如果j到达尾部+1了,则重新置0
if (j == b.length()) {
i = 0;
j = 0;
count++;
}else {
i++;
}
}
System.out.println(count);
}
五、效果展示
1、输入
abcabc
2、输出
abc
3、说明
按照顺序,傻瓜式的从字符串A中取出两个B。哈哈
4、再输入
javajjjnezharrr
jar
5、再输出
2
6、再说明
javajjjnezharrr提取一个jar变为 vajjjnezha*rr,还可以再提取一个vajjnezh**r。
如果变为javajjjnezharrar,我猜想会输出3,你觉得呢?
动手试试吧~~
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。