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;
    }
};
相关推荐
你的冰西瓜2 分钟前
C++中的forward_list容器详解
开发语言·c++·stl·list
无垠的广袤10 分钟前
【FPB-RA6E2 开发板】Zephyr 串口打印 DHT11 温湿度
c++·单片机·串口通信·开发板·瑞萨·传感器·dht11
bbq粉刷匠13 分钟前
Java二叉树基础提升
java·数据结构·算法
客梦14 分钟前
数据结构--栈
数据结构·笔记
nju_spy22 分钟前
12月力扣每日一题(划分dp + 单调栈 + 堆 + 会议安排)
算法·leetcode·二分查找·动态规划·滑动窗口·单调栈·最大堆
智算菩萨24 分钟前
【Python机器学习】支持向量机(SVM)完全指南:从理论到实践的深度探索
算法·机器学习·支持向量机
中國龍在廣州27 分钟前
2025,具身智能正在惩罚“持有者”
人工智能·深度学习·算法·自然语言处理·chatgpt
Tandy12356_29 分钟前
手写TCP/IP协议——实现ping的响应
c语言·网络·c++·网络协议·tcp/ip·计算机网络
爱学习的capoo30 分钟前
电气控制与PLC考点(自用)
算法
byzh_rc41 分钟前
[算法设计与分析-从入门到入土] 递归
数据库·人工智能·算法·机器学习·支持向量机