目录
一、题目
二、思路
1、代码中要使用的String类中的方法
(1)判断 s 中是否有 t
(2)将 s 分割
2、递归判断
三、代码
详细注释版本
简化注释版本
一、题目
题目:剪花布条 题目链接:剪花布条
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入描述:
输入包含多组数据。每组数据包含两个字符串s,t,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。
输出描述:
对应每组输入,输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就输出0,每个结果占一行。
输入
abcde a3
aaaaaa aa
输出
0
3
二、思路
主要是递归(大规模问题化解为相同的小规模问题),以及方法的使用。
要判断 s 中有几个 t ,从前向后判断,每遇到一个 t,结果值就+1。然后再将 t 从 s 中全部切除(也包含前面的不是 t 的,因为不是 t,所以和我们的结果值就无关了,就可以切掉)。然后再判断剩下的 s 中 有几个 t。以此类推。
1、代码中要使用的String类中的方法
(1)判断 s 中是否有 t
- s.indexOf( t ):从前向后判断,s 中是否有 t。有则返回 t 所在的下标,如果没有就返回 -1。
注意:传入的参数 t 可以是字符,也可以是字符串。当时字符串时,返回的是 t 的首字符所在的下标。
(2)将 s 分割
s.substring( ):返回字符串的子字符串。传入的参数有两种形式:
- s.substring( int index ):切除 index 下标之前的字符串。(删除前 index 个字符)
- s.substring( int beginIndex, int endIndex ):返回下标[ beginIndex, endIndex ) 内的字符串。
2、递归判断
根据 indexOf 方法的返回值进行判断,如果不为 -1,就进行递归。为 -1,就返回0 。
三、代码
详细注释版本
import java.util.*;
public class Main {
private static int func(String str1, String str2) {
//str1.indexOf(str2)方法:查找str1中str2的下标,若str1中没有str2,就返回-1
//当查找的是字符串时,返回的是str2首字符在str1中的下标
int i =str1.indexOf(str2);
if(i == -1) {
//说明str1中没有str2
return 0;
}
//str1中有str2,则在str1中将满足的前半部分(包括包含的str2)切除
//再判断str1中剩下的部分有没有str2,然后重复操作。
//将大规模问题化成了相同的小规模问题,因此可以使用递归
//1 是因为代码执行到这里说明 i!=-1,即肯定是有一个str2的,所以加一
return 1 + func(str1.substring(i + str2.length()),str2);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String str1 = sc.next();
String str2 = sc.next();
int ans = func(str1,str2);
System.out.println(ans);
}
}
}
简化注释版本
import java.util.*;
/**
* Created with IntelliJ IDEA.
* Description:剪花布条
* User: WangWZ
* Date: 2023-04-13
* Time: 14:53
*/
public class Main {
private static int func(String str1, String str2) {
int i =str1.indexOf(str2);
if(i == -1) {
return 0;
}
//判断str1中剩下的部分有没有str2,递归
return 1 + func(str1.substring(i + str2.length()),str2);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String str1 = sc.next();
String str2 = sc.next();
int ans = func(str1,str2);
System.out.println(ans);
}
}
}