1375. 至少K个不同字符的子串

 
给定一个仅包含小写字母的字符串 S.
返回 S 中至少包含 k 个不同字符的子串的数量.

样例

样例 1:
输入: S = "abcabcabca", k = 4
输出: 0
解释: 字符串中一共就只有 3 个不同的字符.

样例 2:
输入: S = "abcabcabcabc", k = 3
输出: 55
解释: 任意长度不小于 3 的子串都含有 a, b, c 这三个字符.
比如,长度为 3 的子串共有 10 个, "abc", "bca", "cab" ... "abc"
长度为 4 的子串共有 9 个, "abca", "bcab", "cabc" ... "cabc"
...
长度为 12 的子串有 1 个, 就是 S 本身.
所以答案是 1 + 2 + ... + 10 = 55.

注意事项

  1. 10 ≤ length(S) ≤ 1,000,000
  2. 1 ≤ k ≤ 26
public class Solution {
    /**
     * @param s: a string
     * @param k: an integer
     * @return: the number of substrings there are that contain at least k distinct characters
     */
    public long kDistinctCharacters(String s, int k) {
      int[] map = new int[126];
            int size = 0;
            long sum = 0;
            int i = 0;
            int len = s.length();
            for (; i < len; i++) {
                int c = s.charAt(i);
                if (map[c] == 0) {
                    size++;
                    if (size == k) {
                        sum += len - i;
                        map[c]++;
                        break;
                    }
                }
                map[c]++;
            }
            for (int j = 0; j < len; j++) {
                int c = s.charAt(j);
                map[c]--;
                if (map[c] > 0) {
                    sum += len - i;
                } else {
                    size--;
                    for (i++; i < len; i++) {
                        c = s.charAt(i);
                        if (map[c] == 0) {
                            size++;
                            if (size == k) {
                                sum += len - i;
                                map[c]++;
                                break;
                            }
                        }
                        map[c]++;
                    }
                    if (i == len) {
                        break;
                    }
                }
            }
            return sum;
    }
}
public class Solution {
    /**
     * @param s: a string
     * @param k: an integer
     * @return: the number of substrings there are that contain at least k distinct characters
     */
    public long kDistinctCharacters(String s, int k) {
       HashMap<Character, Integer> map = new HashMap<>(26);
            long sum = 0;
            int i = 0;
            for (; i < s.length(); i++) {
                char c = s.charAt(i);
                if (map.containsKey(c)) {
                    int num = map.get(c);
                    num++;
                    map.put(c, num);
                } else {
                    map.put(c, 1);
                    if (map.size() == k) {
                        sum += s.length() - i;
                        break;
                    }
                }
            }
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                int num = map.get(c);
                num--;
                if (num > 0) {
                    sum += s.length() - i;
                    map.put(c, num);
                } else {
                    map.remove(c);
                    boolean has=true;
                    for (i++; i < s.length(); i++) {
                        c = s.charAt(i);
                        if (map.containsKey(c)) {
                            int size = map.get(c);
                            size++;
                            map.put(c, size);
                        } else {
                            map.put(c, 1);
                            if (map.size() == k) {
                                sum += s.length() - i;
                                has=false;
                                break;
                            }
                        }
                    }
                    if (has){
                        break;
                    }
                }
            }
            return sum;
    }
}

1375. 至少K个不同字符的子串相关推荐

  1. 395. 至少有K个重复字符的最长子串

    395. 至少有K个重复字符的最长子串 Ideas 一开始想到的是sliding window,但是它要求的是最长子串,不太好写. [参考大佬的题解:借本题帮助大家理解递归] 求子串问题除了用双指针还 ...

  2. leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)

    给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度. 示例 1: 输入:s = "aaabb", ...

  3. leetcode340. 至多包含 K 个不同字符的最长子串

    给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 "ece ...

  4. LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...

  5. LeetCode 340. 至多包含 K 个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) ...

  6. 【LeetCode430】至多包含 K 个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 难度困难91收藏分享切换为英文接收动态反馈 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = " ...

  7. leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针

    340.至多包含 K 个不同字符的最长子串 思路 寻找字符串满足某个条件的子串,考虑双指针+滑动窗口思想(右指针一直前进,当遇到某个条件成立/不成立,更新左指针,然后右指针接着前进).首先左右指针从0 ...

  8. 340. 至多包含K个不同字符的最长子串

    340. 至多包含 K 个不同字符的最长子串 难度:中等 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k ...

  9. Leetcode——至多包含K个不同字符的最长子串

    1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...

最新文章

  1. Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
  2. (chap7 确保WEB安全的HTTPS) HTTPS通信步骤
  3. 数据挖掘-数据预处理的必要性及主要任务
  4. SQL点滴27—性能分析之执行计划
  5. Jmeter 使用badyboy 录制脚本
  6. react native开发的新闻客户端
  7. 我的docker随笔30:C++程序的自动化构建
  8. Spring框架----用于创建对象的Component注解
  9. 【博客管理】博客资源汇总【置顶】
  10. 中国联通:网络重构转型的战略规划及痛点
  11. week15作业(字符串)
  12. 使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
  13. 免费ftp软件下载,5款免费ftp软件下载工具
  14. Mindjet MindManager2022完整版思维导图v22.1.234版本
  15. Vue3的生命周期的使用
  16. 爱创课堂每日一题-你做的页面在哪些流览器测试过?
  17. 【MODIS数据处理#13】使用Arcpy一键加工长时间序列MODIS数据
  18. 数据结构与算法—链表常见面试题(持续更新)
  19. SSH机试顺丰搬家预约信息查询参考
  20. 2017华为校招硬件逻辑工程师

热门文章

  1. centos7搭建GRE隧道进行通信
  2. 压缩多张图片,解压后发现图片文件损坏的问题解决
  3. 统信UOS系统添加Windows系统共享的打印机
  4. 用格布拉斯准则剔除异常值,求不确定度
  5. SK海力士加入日韩美三国财团 收购东芝芯片业务
  6. python将多个列表合并_Python中多个列表与字典的合并方法
  7. 自己动手写油猴脚本 - 简单优化微信读书网页版阅读体验
  8. 如何直观的理解机器学习过拟合和欠拟合?
  9. 小程序实现通讯录查询
  10. learn2reg-配准介绍