2.最多提取子串数目(100分)-附带Java逐行解析

题目

给定 [a-z],26个英文字母小写字符串组成的字符串 A 和 B,其中 A 可能存在重复字母,B 不会存在重复字母,现从字符串 A 中按规则挑选一些字母,可以组成字符串B。

挑选规则如下:

  1. 同一个位置的字母只能挑选一次

  2. 被挑选字母的相对先后顺序不能被改变

求最多可以同时从 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);  // 输出最终计数
    }
}

你可能感兴趣的:(华为OD机考试题,算法)