Java日常练习题,每天进步一点点(32)

首先我们需要了解这个题目的基本信息,可以看到这是“Java日常练习题,每天进步一点点”系列中的第32题,很有可能是一道适合初学者的小练习,能够帮助我们巩固一些Java基础知识和编程技巧。

在开始解答之前,我们需要明确这道题目的要求和背景信息。以下是题目的原始描述:

「题目描述」
给你一个字符串 s 和一个非负整数 k,请你找出 s 中的最长子串,要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
「示例 1」
输入: s = "aaabb", k = 3
输出: 3
解释: 最长子串为 "aaa",其中 'a' 重复了 3 次。
「示例 2」
输入: s = "ababbc", k = 2
输出: 5
解释: 最长子串为 "ababb",其中 'a' 重复了 2 次,同时 'b' 重复了 3 次。

我们可以看到,这道题目的基本思路是找出给定字符串中的最长子串,并返回其长度。在找出最长子串的过程中,我们需要保证该子串中的每个字符都出现了至少k次。

这里提供一种解答思路:

  1. 暴力破解法
    此方法中的暴力破解是指使用多重循环来逐一枚举字符串s中的所有子串,并对每个子串进行判断,看它是否符合条件,具体的代码实现思路如下:

  2. 首先,我们使用两重循环来枚举所有可能的子串。外层循环用于控制子串的起点位置,内层循环用于确定子串的结束位置。

  3. 接着,我们对于每个枚举出来的子串,对其进行统计,计算其中每个字符出现的次数,并判断是否满足题目的要求,如果满足,则比较当前长度和之前得到的最长子串长度,更新最长子串长度。
  4. 最后,输出最长子串的长度即可。

具体的代码实现如下:

public static int longestSubstring(String s, int k) {
    int ans = 0;
    int[] count = new int[26];
    for (int i = 0; i < s.length(); i++) {
        Arrays.fill(count, 0);
        for (int j = i; j < s.length(); j++) {
            count[s.charAt(j) - 'a']++;
            boolean valid = true;
            for (int c : count) {
                if (c > 0 && c < k) {
                    valid = false;
                    break;
                }
            }
            if (valid) ans = Math.max(ans, j - i + 1);
        }
    }
    return ans;
}

其中,我们使用了一个计数数组count来记录当前子串中每个字符出现的次数,另外,我们使用了一个布尔变量valid来标记当前子串是否符合题目要求。最终,循环结束后,返回最长子串的长度即可。

  1. 分治递归法
    此方法中的分治递归是指将给定字符串s拆分成若干个部分,对每个部分进行判断和计算,再将所有部分的结果合并,得到最终结果。具体的实现思路如下:

  2. 对于当前给定的字符串s,我们统计其中每个字符出现的次数,如果有任意一个字符不满足题目要求,那么这个字符在最终结果中出现的次数不可能超过k,因此我们可以将原始字符串按照这个字符进行拆分,得到若干个子串。

  3. 对于每个子串,我们递归调用当前函数,得到其最长子串长度。
  4. 将所有子串的最长子串长度合并,得到当前字符串的最长子串长度,返回即可。

具体的代码实现如下:

public static int longestSubstring(String s, int k) {
    if (s == null || s.length() == 0) return 0;
    if (k <= 1) return s.length();
    int[] count = new int[26];
    for (char c : s.toCharArray()) count[c - 'a']++;
    boolean isAllValid = true;
    for (int c : count) {
        if (c > 0 && c < k) isAllValid = false;
    }
    if (isAllValid) return s.length();
    int ans = 0, i = 0, j = 0;
    while (j < s.length()) {
        if (count[s.charAt(j++) - 'a']-- >= k) continue;
        ans = Math.max(ans, longestSubstring(s.substring(i, j - 1), k));
        i = j;
    }
    ans = Math.max(ans, longestSubstring(s.substring(i), k));
    return ans;
}

这段代码中,我们定义了一个辅助函数longestSubstring,用于递归地计算子串的最长字符长度。在主函数中,我们首先对字符串s遍历一遍,统计每个字符出现的次数。如果有任意一个字符的出现次数小于k,那么这个字符在任意最长字串中都不可能出现,因此我们可以将原始的字符串按照这个字符进行拆分,分别对每个部分递归计算,最后将所有结果合并,得到最终答案。

综上所述,在解答这个问题时,我们可以采用暴力破解法或者分治递归法来得到答案。以上是两种方法的基本思路和代码实现,具体实现过程中还需要适当调整和修改,以满足题目的要求和约束条件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java日常练习题,每天进步一点点(32) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java中try catch处理异常示例

    下面就是“Java中try catch处理异常示例”的详细讲解。 1. 什么是异常? 在Java程序运行过程中,可能会遇到一些非正常的情况,例如读取文件时文件不存在、网络连接异常等等,这些非正常的情况被称为“异常”。 Java中的异常是Throwable类及其子类的实例,可分为检查型异常和非检查型异常(也叫运行时异常)。其中,检查型异常必须显式处理,而非检查…

    Java 2023年5月28日
    00
  • java并发JUC工具包AtomicInteger原子整型语法基础

    Java并发JUC工具包提供了一些高效且线程安全的队列、锁和原子变量等工具类,其中AtomicInteger是实现原子性操作整型数据的类。 AtomicInteger类 AtomicInteger类是java.util.concurrent包中的一个类,它提供了一种原子性的更新机制,即多线程环境下对共享的整型变量进行原子性操作,避免了线程安全问题。常用的原子…

    Java 2023年5月26日
    00
  • java代码实现C盘文件统计工具

    Java代码实现C盘文件统计工具 本攻略介绍如何使用Java编写一个C盘文件统计工具,可以计算C盘某个目录下的文件数量、目录数量、总大小等信息,并输出到控制台。 步骤一:创建Java项目 首先,打开Eclipse,在工作区中创建一个Java项目。 选择菜单栏中的 “File” –> “New” –> “Java Project”。 输入项目的…

    Java 2023年5月19日
    00
  • SpringBoot搭建全局异常拦截

    一、概述 在使用Spring Boot开发Web应用的过程中,我们经常会遇到程序抛出异常的情况。如何优雅地处理这些异常,返回友好的错误信息给客户端,是很重要的一件事情。Spring Boot提供了全局异常处理机制,可以方便地实现统一的异常处理逻辑,减少代码重复,提高开发效率。 本文将介绍如何使用Spring Boot自带的全局异常处理机制,搭建一个通用的全局…

    Java 2023年5月27日
    00
  • 使用MyEclipse 开发struts2框架实现登录功能(结构教程)

    使用MyEclipse开发Struts2框架实现登录功能主要分为以下几个步骤: 创建Web项目 在MyEclipse中新建Web项目,在选项中选择Struts2作为框架。 配置Struts2 配置Struts2需要在项目中添加struts2-core.jar和struts2-config-browser-plugin.jar两个库文件。在web.xml文件中…

    Java 2023年5月20日
    00
  • Eclipse中配置Maven build打包的方法步骤

    下面是详细的攻略过程。 Eclipse中配置Maven Build打包的方法步骤 1. 配置Maven环境变量 在Windows系统中,需要将Maven安装路径中的bin目录添加到系统的Path环境变量中。打开控制面板,搜索“环境变量”,点击“编辑系统环境变量”,找到“Path”变量,点击“编辑”,在弹出的窗口中添加Maven的bin目录路径。Mac和Lin…

    Java 2023年5月20日
    00
  • Java中Arrays数组工具类的基本使用详解

    Java中Arrays数组工具类的基本使用详解 简介 Arrays类是java.util包中提供的一个工具类。它针对数组提供了很多有用的方法。这些方法帮助我们完成了数组复制、排序、查找、修改等操作。通过使用Arrays类,用户能够在不使用检查或转换的情况下操作各种类型的数组。 Arrays类的常用方法 1.排序 使用Arrays类排序的方法,可以根据默认的升…

    Java 2023年5月26日
    00
  • 获取Java的MyBatis框架项目中的SqlSession的方法

    获取Java的MyBatis框架项目中的SqlSession对象的方法,可以从以下几个方面进行介绍。 方法一:通过MyBatis提供的SqlSessionFactory创建SqlSession对象 首先,在Java的MyBatis框架项目中,需要首先通过MyBatis提供的SqlSessionFactory创建SqlSession对象。可以通过以下步骤实现:…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部