leetcode-340 Longest Substring with at most k-distinct characters(至多包含 K 个不同字符的最长子串)

2023-10-27

题目描述

给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。

示例 1:

输入: s = "eceba", k = 2
输出: 3
解释: 则 T 为 "ece",所以长度为 3。

示例 2:
输入: s = "aa", k = 1
输出: 2
解释: 则 T 为 "aa",所以长度为 2

思路:滑动窗口

套模板:

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    HashMap<Character, Integer> need,window;

    for (int i = 0; i < t.length(); i++) {
    	// 初始化目标map
    }

    int left = 0, right = 0;
    int valid = 0; 

    while (right < s.length()) {
        // c 是将移入窗口的字符
        char c = s.charAt(right);
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新(增加window这个map中的计数)
        ...

        /*** debug 输出的位置 ***/
        System.out.printf("window: %d, %d", left, right);
        /********************/

        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s.charAt(left);
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新(减少window这个map中的计数)
            ...
        }
    }
    // 返回结果
}

收缩条件:窗口内的字符种数 > k
结果更新的时机:每次窗口右移后

代码:

class Solution {
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        if (k == 0) return 0;
    	HashMap<Character, Integer> window = new HashMap<Character, Integer>();
    	int i = 0, j = 0;
    	int ch_num = 0;
    	int res = 0;
    	int len = s.length();
    	while(j < len) {
    		// c 是将移入窗口的字符
        	char c = s.charAt(j);
    		// 窗口右移
    		j++;
    		// 更新数据
    		if (window.getOrDefault(c, 0) > 0) {
    			window.put(c, window.get(c) + 1);
    		} else {
    			// 新来的
    			ch_num++;
    			window.put(c, 1);
    		}

            // 更新结果
            if (j - i  > res && ch_num <= k) {
    			res = j - i ;
    		}

    		// 判断左窗口是否要收缩
    		while(ch_num > k) {

    			// d 是将移出窗口的字符
        		char d = s.charAt(i);
        		// 窗口左移
        		i++;
        		// 更新数据
        		window.put(d, window.get(d) - 1);
        		if (window.get(d) == 0) {
        			ch_num--;
        		}
    		}
            

    		
    	}
    	return res;
    }
}

时间复杂度:O(n)
空间复杂度:O(k)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode-340 Longest Substring with at most k-distinct characters(至多包含 K 个不同字符的最长子串) 的相关文章

随机推荐

  • poll两种模式浅析(ET or LT)

    转 http gotowqj iteye com blog 1931556 linux异步IO浅析 http hi baidu com kouu blog item e225f67b337841f42f73b341 html epoll有两
  • Timing Arc

    Timing arc 时序弧 描述从一个pin到另一个pin之间的不可分割的路径时序信息 关键术语 source pin timing arc的起始点 以下图为例 CLK是a1和a8的source pin FF1 CK是a2的source
  • 软件测试--静态白盒测试

    软件测试 静态白盒测试 静态测试是指测试非运行部分 检查和审查 静态白盒测试是指在不执行软件的条件下条理地仔细审查软件设计 体系结构和代码 从而找出软甲缺陷的过程 又称为结构化测试 静态白盒测试的好处 能够尽早发现软件缺陷 并且能够为黑盒测
  • 浅析网络编程之AF_INET和PF_INET

    在网络编程中 创建TCP套接字时 我们使用 socked socket AF INET SOCK STREAM 0 来创建一个网际 AF INET 字节流 SOCK STREAM 套接字 AF表示ADDRESS FAMILY 地址族 PF表
  • VueX报错:Uncaught TypeError: Object(...) is not a function at resetStoreState (vuex.esm-browser.js?

    当我们使用Vuex并运行项目时 发现浏览器报如下错误 这是因为Vuex 版本过高所导致的 我们去package json中查看我们当前的Vuex版本为 vuex 4 0 2 只需重新安装低版本的Vuex就可以解决问题 我们在终端输入 npm
  • Frechet Distance距离算法详解

    Frechet Distance 它是计算两曲线距离的算法 用来判断两曲线的相似度 计算结果越小说明相似度越高 基于python实现该算法 需要下载numpy包 向量库 import math import numpy as np 这个方法
  • jquery获得当前元素父级元素_如何使用jQuery获取父元素

    jQuery获取父元素我们有三种方式可以实现 parent parents closest 下面我们将介绍jQuery获取父元素的这三种方式以及一个具体的示例 web前端学习 打造全网web前端全栈资料库 总目录 看完学的更快 掌握的更加牢
  • 蛋白+小分子配体md(详细保姆教程)

    继续搬一点近期飞书文档模拟的到博客里 参考博客 Gromac中文教程 https jerkwin github io GMX GMXtut 5 E6 A6 82 E8 BF B0 https www jianshu com p b10fe4
  • 基于Python的爬虫设计与数据分析 计算机毕业设计源码37836

    目 录 摘要 1 绪论 1 1课题背景 1 2研究目的及意义 1 3爬虫技术 1 4django框架介绍 2 1 5论文结构与章节安排 3 2 基于Python的爬虫设计与数据分析分析 4 2 1 可行性分析 4 2 2 系统流程分析 4
  • 用户积分营销的三种方式

    私域流量时代下 商家们都纷纷搭建私域流量池来实现引流 增长 但是如果商家只是单纯地通过搭建私域流量池来实现用户进行转化 出来的效果是非常缓慢的 同时对于用户留存以及用户粘性的提升帮助不是太大 因此 我们需要设计一种新的玩法去进行私域流量池运
  • 设置DialogFragment背景透明

    设置DialogFragment背景透明的方法如下 1 在onCreateView 方法中设置弹窗内部的背景透明 Override public View onCreateView LayoutInflater inflater Nulla
  • postman下载文件乱码

    环境 postman v8 0 7 遇到的问题 postman下载文件时乱码 解决方案 不要用send 用边上小箭头里的send and Download
  • JS 鼠标粒子效果

  • UE虚幻引擎教程_生成云平台指定路径下的exe文件

    市面上大量优秀的游戏都是基于UE制作的 UE虚幻引擎制作的作品可以在windows mac linux以及ps4 x boxone ios android甚至是html5等平台上运行 本文介绍了UE虚幻引擎如何生成云平台指定路径下的EXE
  • 创建操作符(初稿)

    just 将一个或多个对象转换成发射这个或这些对象的一个Observable from 将一个Iterable 一个Future或者一个数组转换成一个Observable create 使用一个函数从头创建一个Observable defe
  • vim 插入模式小技巧

    1 vim插入模式快捷键 ctrl h 删除上一个字符 ctrl w 删除上一个单词 ctrl u 删除当前行 这三个快捷键也适用与终端中 2 终端中的快捷键 ctrl a 快速移动到行首 ctrl e 快速移动到行末 ctrl b 向前移
  • 面试题-网络

    以下所有整理内容都是我从第一次面试开始 将所有遇到的问题整合后的结果 所有的内容都是我在面试中真实遇到的问题 有BAT这样的大厂 也有很多小厂 在面试超过20家之后 遇到的绝大多数问题都开始重复 这份资料给我的面试带来了非常多的便利 现在我
  • 大数据单机学习环境搭建(12)Azkaban的简单使用

    专题 大数据单机学习环境搭建和使用 1 登录和密码修改 2 新建工程 2 1新建工程 2 2创建zip文件 2 3添加文件到项目 3 任务执行 3 1立即执行 3 2 设置定时任务 4 依赖任务建立 大数据单机学习环境搭建 12 Azkab
  • OpenCV Mat数据类型指针ptr的使用

    常用形式 mat ptr
  • leetcode-340 Longest Substring with at most k-distinct characters(至多包含 K 个不同字符的最长子串)

    题目描述 给定一个字符串 s 找出 至多 包含 k 个不同字符的最长子串 T 示例 1 输入 s eceba k 2 输出 3 解释 则 T 为 ece 所以长度为 3 示例 2 输入 s aa k 1 输出 2 解释 则 T 为 aa 所