【LeetCode 1358】Number of Substrings Containing All Three Characters【Medium】【JAVA】

该博客介绍了LeetCode第1358题,题目要求找到包含'a','b','c'三个字符的所有子串。博主分享了使用暴力法思路及遍历法的解决方案,提供了JAVA代码实现,并给出了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

在这里插入图片描述

2. 题意

题目几个关键信息:

  • 该字符串只包含’a’,‘b’,'c’三种字符
  • 示例1中发现对于相同但是位置不同的子串,是按两个结果计算,无需去掉重复
  • 该字符串长度默认大于3

3. 方法

3.1 思路

最简单的思路就是暴力法,直接两个循环,并判断结果字符串是否都包含了’a’,‘b’,'c’三种字符。但该方法时间复杂度较高,O(n²),因此考虑有没有简单的做法。
题目是求符合条件的子串,这种要求很容易想到双指针进行遍历。

3.2 代码

	public int numberOfSubstrings(String s) {
        int start = 0, end = 0, number = 0;
        int[] nums = new int[3];

        while (end < s.length()) {
        	// 向后遍历,并标记出现的字符
            nums[s.charAt(end++) - 'a']++;
            // 当三个字符都包含时,移动start指针
            while (nums[0] > 0 && nums[1] > 0 && nums[2] > 0) {
            	// 将start指针向后移动,直到再次无法同时包含三个字符
            	// 这时,start的值也为以end下标为字符串末位的,符合条件的子字符串数
                nums[s.charAt(start++) - 'a']--;
            }
            number += start;
        }

        return number;
    }

3.3 运行结果

在这里插入图片描述

4. 相关链接

本题代码的github链接
其他 Top 100 Liked Questions 题目
其他 LeetCode 题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值