给定一个仅包含小写字母的字符串 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.
注意事项
10 ≤ length(S) ≤ 1,000,000
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个不同字符的子串相关推荐
- 395. 至少有K个重复字符的最长子串
395. 至少有K个重复字符的最长子串 Ideas 一开始想到的是sliding window,但是它要求的是最长子串,不太好写. [参考大佬的题解:借本题帮助大家理解递归] 求子串问题除了用双指针还 ...
- leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度. 示例 1: 输入:s = "aaabb", ...
- leetcode340. 至多包含 K 个不同字符的最长子串
给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 "ece ...
- LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...
- LeetCode 340. 至多包含 K 个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) ...
- 【LeetCode430】至多包含 K 个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 难度困难91收藏分享切换为英文接收动态反馈 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = " ...
- leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针
340.至多包含 K 个不同字符的最长子串 思路 寻找字符串满足某个条件的子串,考虑双指针+滑动窗口思想(右指针一直前进,当遇到某个条件成立/不成立,更新左指针,然后右指针接着前进).首先左右指针从0 ...
- 340. 至多包含K个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串 难度:中等 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k ...
- Leetcode——至多包含K个不同字符的最长子串
1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...
最新文章
- Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
- (chap7 确保WEB安全的HTTPS) HTTPS通信步骤
- 数据挖掘-数据预处理的必要性及主要任务
- SQL点滴27—性能分析之执行计划
- Jmeter 使用badyboy 录制脚本
- react native开发的新闻客户端
- 我的docker随笔30:C++程序的自动化构建
- Spring框架----用于创建对象的Component注解
- 【博客管理】博客资源汇总【置顶】
- 中国联通:网络重构转型的战略规划及痛点
- week15作业(字符串)
- 使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
- 免费ftp软件下载,5款免费ftp软件下载工具
- Mindjet MindManager2022完整版思维导图v22.1.234版本
- Vue3的生命周期的使用
- 爱创课堂每日一题-你做的页面在哪些流览器测试过?
- 【MODIS数据处理#13】使用Arcpy一键加工长时间序列MODIS数据
- 数据结构与算法—链表常见面试题(持续更新)
- SSH机试顺丰搬家预约信息查询参考
- 2017华为校招硬件逻辑工程师
热门文章
- centos7搭建GRE隧道进行通信
- 压缩多张图片,解压后发现图片文件损坏的问题解决
- 统信UOS系统添加Windows系统共享的打印机
- 用格布拉斯准则剔除异常值,求不确定度
- SK海力士加入日韩美三国财团 收购东芝芯片业务
- python将多个列表合并_Python中多个列表与字典的合并方法
- 自己动手写油猴脚本 - 简单优化微信读书网页版阅读体验
- 如何直观的理解机器学习过拟合和欠拟合?
- 小程序实现通讯录查询
- learn2reg-配准介绍