《剪花布条》:从花布条中尽可能剪出几块小饰条

目录

一、题目

二、思路

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);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值