全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:最多提取子串数目
知识点:字符串统计
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给定由 [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的字符串
行末无多余空格
补充说明:
无需验证输入格式和输入数据合法性
示例1
输入:
badc
bac
输出:
1
说明:
从字符串A(“badc”)中可以按字母相对先后顺序取出字符串B(“bac”)
示例2
输入:
badc
abc
输出:
0
说明:
从字符串A(“badc”)中无法按字母相对先后顺序取出字符串B(“abc”)
示例3
输入:
aabbcxd
abcd
输出:
1
说明:
从字符串A(“aabbcxd”)中挑选一组B(“abcd”)后,A中剩余字符串为”abx”,无法再挑出”abcd”
示例4
输入:
ababcecfdc
abc
输出:
2
说明:
按如下步骤(步骤不唯一),可以同时从字符串A(“ababcecfdc”)中最多取出两个B(“abc”),其中下划线标注的是每步提取的字母:
剩余的”efdc”无法继续提取”abc”,结果为2
示例5
输入:
aaa
a
输出:
3
说明:
从字符串A(“aaa”)中可以挑选3个字符串B(“a”)
解题思路:
如示例4:
父字符串:ababcecfdc 父索引indexF=0
子字符串:abc 子索引indexS=0
indexF=0, indexS=0 a == a;
indexF+1=1, indexS+1=1 b == b
indexF+1=2, indexS+1=2 a != c
indexF+1=3, indexS=2 b ! = c
indexF+1=4, indexS=2 c == c
满足子串 父字符串变为:ab ecfdc(匹配过的需要用空字符串替代)
indexF=0, indexS=0 a == a;
继续重复上面操作,直至indexF=父字符串长度-1
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.Scanner; /** * @title 最多提取子串数目 * @Description 给定由 [a-z] 26个英文小写字母组成的字符串A和B,其中A中可能存在重复字母,B中不会存在重复字母 * 现从字符串A中按规则挑选一些字母,可以组成字符串B。 * 挑选规则如下: * 1) 同一个位置的字母只能被挑选一次 * 2) 被挑选字母的相对先后顺序不能改变 * 求最多可以同时从A中挑选多少组能组成B的字符串 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String strF = sc.nextLine(); //父字符串 String strS = sc.nextLine(); //子字符串 char[] chars = strF.toCharArray(); //将父字符串转化为数组 int indexF = 0; //父字符串索引 int indexS = 0; //子字符串索引 int count = 0; //符合的个数 while (indexF < strF.length()){ if(chars[indexF] == strS.charAt(indexS)){ chars[indexF] = ' '; //已经匹配的置为空 indexS++; } if(indexS == strS.length()){ //长度相同则表示符合子串 indexS = 0; indexF = 0; count++; }else { indexF++; //不符合则匹配下一个字符 } } System.out.println(count); } }
代码实现二:
package com.codernav.demo.hwod.exam; import java.util.Scanner; /** * @title 最多提取子串数目 * @Description 给定由 [a-z] 26个英文小写字母组成的字符串A和B,其中A中可能存在重复字母,B中不会存在重复字母 * 现从字符串A中按规则挑选一些字母,可以组成字符串B。 * 挑选规则如下: * 1) 同一个位置的字母只能被挑选一次 * 2) 被挑选字母的相对先后顺序不能改变 * 求最多可以同时从A中挑选多少组能组成B的字符串 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String stra = sc.nextLine(); char[] x = stra.toCharArray(); String strb = sc.nextLine(); int[] arrs = new int[stra.length()]; int index = 0; int count = 0; int i = 0; while (i < stra.length()) { if (x[i] == strb.charAt(index)) { arrs[index] = i + 1; index++; x[i] = '0'; } if (index == strb.length()) { index = 0; i = arrs[0]; count++; } else { i++; } } System.out.print(count); } }