最多提取子串数目
/**
- 最多提取子串数目
- 题目给定由[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
- 说明
- 从字符串 A(“badc”)中可以按字母相对先后顺序取出字符串 B(“bac”)
- 解题思路:
- 本题不难,主要是设置两个指针i,j,当字符串A和字符串B的字符相等,且没有使用过的时候,先将j进行移动
- 如果j已经到达尾部+1,那么将i,j置0, 结果sum加1,然后重新开始进行比较
*/
package com.darling.boot.order.od.od16;
import java.util.*;
//29 最多提取子串数目
/**
* 最多提取子串数目
* 题目给定由[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
* 说明
* 从字符串 A(“badc”)中可以按字母相对先后顺序取出字符串 B(“bac”)
*
* 解题思路:
* 本题不难,主要是设置两个指针i,j,当字符串A和字符串B的字符相等,且没有使用过的时候,先将j进行移动
* 如果j已经到达尾部+1,那么将i,j置0, 结果sum加1,然后重新开始进行比较
*/
public class Main1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String strA = sc.nextLine();
String strB = sc.nextLine();
boolean[] used = new boolean[strA.length()];
int sum = 0;
int i = 0;
int j = 0;
while (i < strA.length()) {
if (strA.charAt(i) == strB.charAt(j) && !used[i]) {
used[i] = true;
//能匹配对应的字符,子串指针后移
j++;
}
//如果j到达尾部+1了,则重新置0
if (j == strB.length()) {
i = 0;
j = 0;
sum++;
}else {
i++;
}
}
System.out.println(sum);
}
}