题目
给定 [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 的字符串
行末没有多余空格
备注
无需验证输入格式和输入数据合法性
用例
用例一:
输入:
badc
bac
输出:
1
用例二:
输入:
badc
abc
输出:
0
用例三:
输入:
aabbcxd
abcd
输出:
1
题解:
import java.util.*;
public class demo01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入的两个字符串String parent = sc.nextLine(); // 父字符串String child = sc.nextLine(); // 子字符串int length = parent.length();// matched数组用于记录parent中每个字符是否已被匹配过int[] matched = new int[length];int count = 0; // 计算子序列出现次数for (int i = 0; i < length; ) { // 遍历父字符串int j = 0; // 子字符串的索引while (i < length && j < child.length()) { // 尝试匹配if (parent.charAt(i) == child.charAt(j) && matched[i] == 0) { // 如果字符匹配且未被标记matched[i] = 1; // 标记当前字符j++; // 移动子字符串指针}i++; // 移动父字符串指针}if (j == child.length()) { // 如果子字符串完全匹配count++; // 增加计数i = -1; // 重置i,以便从头开始新的匹配}}System.out.println(count); // 输出最终计数}
}