刷题第六天<滑动窗口>(跑路人笔记)

简介: 刷题第六天<滑动窗口>(跑路人笔记)

第六天(滑动窗口)

无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)

image.png

这个解法是一个大佬的做法非常牛逼,而且十分易懂,注释已做讲解.

int lengthOfLongestSubstring(char * s)
{
    int start = 0;
    int end = 0;
    int map[256] = {0};//本题字符串有英文数字符号和空格组成
    int maxlen = 0;//用来记录最长 
    map[(int)s[start]] = 1;
    while(s[end] != '\0')
    {
        maxlen = maxlen > (end - start + 1)?maxlen:(end-start+1);//更新maxlen
        end++;
        while(map[(int)s[end]] != 0)//新加入的字符跟子串有冲突就一直start向后移,直到把冲突的字符吐出
        {
            map[(int)s[start]] = 0;//把start位置的吐出
            start++;
        }
        map[(int)s[end]] = 1;//把新加入的字符输入进去方便后面排查
    }
    return maxlen;
}

字符串的排列

567. 字符串的排列 - 力扣(LeetCode)


image.png


其实这个题倒是还给我们简化了思路,因为只需要是排序之一就可以算成是子串,我们只需要记录s1内都有多少元素并记录他们都出现了几次,然后再通过把s2分成和s1相同的子串并进行比对是否和s1字符出现的次数相同,若果有任意一个相同就可以返回true了.


看注释应该就能看懂了 =.=

bool check(char* s2,int*map2,int start,int end)
{
    for(int i = start;i <= end;i++)
    {
        if(map2[(int)(s2[i]-'a')])
        {
             map2[(int)(s2[i]-'a')]--;
        }
        else//一旦map2内的数值为0就返回假.
        {
            return false;
        }
    }
    return true;
}
bool checkInclusion(char * s1, char * s2)
{
    int ss1 = strlen(s1),ss2 = strlen(s2);
    if(ss2<ss1)
    {
        return false;
    }
    int map1[26] ,map2[26];//建立两个是为了方便拷贝
    memset(map1,0,sizeof(map1));
    memset(map2,0,sizeof(map2));//都初始化为0是为了后面记录子串中的字符
    int start = 0;
    int end = ss1-1;//保证窗口大小是n,也就是s2中子串长度为n
    for(int i = 0;i<ss1;i++)
    {
        map1[(int)(s1[i]-'a')]++;
        map2[(int)(s1[i]-'a')]++;//记录出现的字符次数
    }
    while(s2[end] != '\0')
    {
        if(check(s2,map2,start,end))//通过函数判断是否子串字符个数都相同
        {
            return true;
        }
        else
        {
            memcpy(map2,map1,sizeof(map1));//如果为假就重新吧map2回归到map1状态
            start++;
            end++;//移动窗口
        }
    }
    return false;
}
相关文章
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
232 4
|
存储 弹性计算 容灾
华为云从入门到实战 | 云关系数据库备份、恢复及存储容灾服务
主要介绍华为云数据库RDS的备份与恢复部署过程以及SDRS的创建部署过程。
784 0
华为云从入门到实战 | 云关系数据库备份、恢复及存储容灾服务
|
数据可视化 定位技术 Python
基于ArcMap的精美地图可视化绘制--以各省GDP数据为例
大家好,我是志斌~ 今天手把手教大家如何用ArcMap 10.3画分级地图。
2123 0
基于ArcMap的精美地图可视化绘制--以各省GDP数据为例
|
12月前
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
610 1
|
8月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
434 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
AI如何预测体育比赛结果
AI预测体育比赛结果依赖于历史数据、球员表现、球队状态等多因素。通过数据收集与处理、机器学习模型(如回归分析、神经网络)、模拟与蒙特卡洛方法、实时数据分析及自然语言处理等技术,AI能识别影响比赛的关键模式,评估胜负概率,并结合统计学与优化算法不断调整预测,提升准确性。
|
12月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
210 7
|
12月前
|
Web App开发 JavaScript 前端开发
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
本文介绍如何在鸿蒙 Flutter 开发中调试 Webview,包括配置允许调试、找到 devtools 端口、开启端口转发、在 Chrome 中调试 Webview等。
376 0
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
|
11月前
|
供应链 区块链 数据安全/隐私保护
智能合约技术在供应链管理中的应用与挑战####
智能合约,作为区块链技术的重要组成部分,正逐步渗透至供应链管理领域,以其自动化执行协议、增强透明度与效率的特性,重塑着传统供应链的运作模式。本文旨在探讨智能合约如何在供应链中发挥作用,解决现有问题,并分析面临的挑战及可能的解决方案。通过具体案例分析,揭示其在提高供应链透明度、降低成本、加速交易速度等方面的潜力。 ####
|
12月前
|
Kubernetes Cloud Native Serverless
批处理系统:Batch批量计算与云原生Serverless Argo Workflows
本文对比了Batch批量计算与Serverless Argo Workflows在容器化批处理任务中的应用,分析了两者在任务定义、依赖关系、规模并发、高级编排、可移植性等方面的异同,帮助技术决策者根据自身需求选择合适的平台。