leetcode 3090. 每个字符最多出现两次的最长子字符串

题目如下

数据范围

复制代码
观察数据范围发现s最长也就100也就是说O(n^2)的暴力法的时间复杂度也是可以接受的。
不过本题使用不定长滑动窗口可以优化至O(n)是本人比较推荐的。
那么滑动窗口是如何把时间复杂度优化成O(n)的呢?
暴力法如下
cpp 复制代码
for(int i = 0;i < s.size();i++){
	for(int j = i;j < s.size();j++{
		.....
	}
}
复制代码
这样写虽然简单但是产生了大量的重复计算即已经知道的合法的子串或者不合法的子串会被多次遍历。而使用滑动窗口。
cpp 复制代码
 for(int i = 0;i < n;i++){
        while((i + j) < n&&map[s[i + j]] < 2) {
           map[s[i + j]]++; j++;
        }
        max1 = max(max1,j);
        j--;
        map[s[i]]--;

    }
复制代码
在代码里面我们通过i来固定左端点同时移动j 注意i j都是不走回头路的因为我们保证从i到j的子串是合法的所以没有往回走的必要,换句话说我们只遍历一遍字符串成功把时间复杂度优化到O(n)。

通过代码

cpp 复制代码
class Solution {
public:
    int maximumLengthSubstring(string s) {
            unordered_map<char,int> map;
    int n = s.size();
    if(n == 0)return 0;
    int max1 = 1;
    int j = 0;
    for(int i = 0;i < n;i++){
        while((i + j) < n&&map[s[i + j]] < 2) {
           map[s[i + j]]++; j++;
        }
        max1 = max(max1,j);
        j--;//因为包含s[j]会导致字符串不合法所以实际上我们的i j是左闭右开的
        map[s[i]]--;

    }
    return max1;
    }
};
相关推荐
你撅嘴真丑6 分钟前
求10000 以内的阶乘 与 字符串最大跨距
数据结构·c++·算法
Figo_Cheung8 分钟前
Figo几何基础论:基于集合几何化的统一理论框架与哲学意涵——首次提出“几何化诱导的全息原理”
算法·机器学习·概率论·迭代加深
lingzhilab12 分钟前
零知IDE—— ESP8266(ESP-12F)MESH 组网实现多设备智能家居控制系统(灯光 / 传感器 / 人体感应)
c++·ide·智能家居
小y要自律17 分钟前
11 string容器 - 子串获取
c++·算法·stl
t1987512817 分钟前
三相计量芯片RN8302B驱动校正程序设计与实现
算法
好奇龙猫19 分钟前
【大学院-筆記試験練習:线性代数和数据结构(17)】
数据结构·学习·线性代数
期末考复习中,蓝桥杯都没时间学了22 分钟前
力扣刷题9
算法·leetcode·职场和发展
DevangLic22 分钟前
【确认是否安装了 C++ 工具】
android·java·c++
砚边数影26 分钟前
线性回归原理(二):梯度下降算法,Java实现单变量/多变量拟合
java·数据库·算法·线性回归·kingbase·kingbasees·金仓数据库
承渊政道31 分钟前
C++学习之旅【C++拓展学习之反向迭代器实现、计算器实现以及逆波兰表达式】
c语言·开发语言·c++·学习·visual studio