LintCode 题解丨网易面试题:最多有k个不同字符的最长子字符串

简介: LintCode 题解丨网易面试题:最多有k个不同字符的最长子字符串

给定字符串S,找到最多有k个不同字符的最长子串T。

在线评测地址:LintCode 领扣

样例 1:

输入: S = "eceba" 并且 k = 3

输出: 4

解释: T = "eceb"

样例 2:

输入: S = "WORLD" 并且 k = 4

输出: 4

解释: T = "WORL" 或 "ORLD"

算法:同向双指针 + 哈希表

通过使用同向双指针的算法,我们可以做到一次遍历字符串就得到答案。 在字符串上移动滑动窗口,保证窗口内有不超过 k 个不同字符,同时在每一步更新最大子串长度。

如果字符串为空或者 k 是零的话返回 0。
设置指针为字符串开头 left = 0 和 right = 0,初始化最大子串长度 maxLen = 1。
当 right < N 时: - 将当前字符 s[right] 加入哈希表并且向右移动 right 指针。 - 如果哈希表包含 k + 1 个不同字符,在哈希表中移去最左出现的字符(s[left]),右移动 left 指针使得滑动窗口只包含 k 个不同字符。 - 更新 maxLen = max(maxLen, right - left)。
复杂度分析

时间复杂度O(n) - 只用扫描一遍字符串,复杂度即字符串的长度
空间复杂度O(kind) - 只用开一个数组记录各种不同的字符
public class Solution {

/**
 * @param s: A string
 * @param k: An integer
 * @return: An integer
 */
public int lengthOfLongestSubstringKDistinct(String s, int k) {
    
    if (s.length() == 0 || k == 0) {
        return 0;
    }
    
    int left = 0, right = 0, cnt = 0;
    int charSet[] = new int[256];
    int ans = 0;
    
    while (right < s.length()) {
        // 统计right指向的字符
        // 当字符在窗口内第一次出现时,字符种类数+1,该字符出现次数+1
        if (charSet[s.charAt(right)] == 0) {
            cnt++;
        }
        charSet[s.charAt(right)]++;
        right++;
        
        // 向右移动left,保持窗口内只有k种不同的字符
        while (cnt > k) {
            charSet[s.charAt(left)]--;
            // 当该字符在本窗口不再出现时,字符种类数-1
            if (charSet[s.charAt(left)] == 0) {
                cnt--;
            }
            left++;
        }
        
        // 更新答案
        ans = Math.max(ans, right - left);
    }
    return ans;
}

}
更多题解参考:

九章算法 - 帮助更多中国人找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧

相关文章
|
9月前
|
Oracle Java 关系型数据库
一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”
【5月更文挑战第13天】一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”
123 4
|
8月前
|
存储 Linux C++
网易面试:手撕定时器
网易面试:手撕定时器
81 1
|
3月前
|
安全 算法 网络协议
网易面试:说说 HTTPS 原理?HTTPS 如何保证 数据安全?
45岁老架构师尼恩在其读者交流群中分享了关于HTTP与HTTPS的深入解析,特别针对近期面试中常问的HTTPS相关问题进行了详细解答。文章首先回顾了HTTP的工作原理,指出了HTTP明文传输带来的三大风险:窃听、篡改和冒充。随后介绍了HTTPS如何通过结合非对称加密和对称加密来解决这些问题,确保数据传输的安全性。尼恩还详细解释了HTTPS的握手过程,包括如何通过CA数字证书验证服务器身份,防止中间人攻击。最后,尼恩强调了掌握这些核心技术的重要性,并推荐了自己的技术资料,帮助读者更好地准备面试,提高技术水平。
|
6月前
|
安全 Java 编译器
【Java基础面试二十九】、说一说你对字符串拼接的理解
这篇文章讨论了Java中字符串拼接的四种常用方式(使用`+`运算符、`StringBuilder`、`StringBuffer`和`String`类的`concat`方法),每种方式适用的场景,以及在不同情况下的性能考量。
|
6月前
|
Java
【Java基础面试二十八】、使用字符串时,new和““推荐使用哪种方式?
这篇文章讨论了在Java中使用字符串时,推荐使用双引号`""`直接量方式而不是使用`new`操作符,因为`new`会在常量池之外额外创建一个对象,导致更多的内存占用。
|
9月前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
82 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
8月前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
8月前
|
设计模式 NoSQL Java
网易面试:SpringBoot如何开启虚拟线程?
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 > PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: ![image.png](https:
107 0
网易面试:SpringBoot如何开启虚拟线程?
|
7月前
|
存储 安全 Java
Java面试题:请解释Java中的字符串和字符串缓冲区?
Java面试题:请解释Java中的字符串和字符串缓冲区?
47 0
|
9月前
|
前端开发 Java 物联网
Android开发面试基础,3天拿到网易Android岗offer
Android开发面试基础,3天拿到网易Android岗offer

热门文章

最新文章