首页 > 其他分享 >无重复字符最长子串

无重复字符最长子串

时间:2023-03-09 17:15:02浏览次数:44  
标签:子串 字符 right 窗口 int len 滑动 最长 left

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

 

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3


方法一
基本思路:滑动窗口

什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?

我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

作者:powcai
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-dong-chuang-kou-by-powcai/
来源:力扣(LeetCode)

int que_find(char *que, char *s, int len)    //遍历数组,寻找是否存在与*s相同的元素
{
    for(int i = 0; i < len; i++)
    {
        if(*s == *(que + i))
            return 1;
    }
    return 0;
}


int lengthOfLongestSubstring(char * s){
     
    int len = strlen(s);
    char *que = malloc(sizeof(char)*len);    //注意malloc()分配的使用,直接使用malloc(sizeof(s))会产生下图报错信息
    int max_len=0, cur_len=0;
    int end = 0, start = 0;
    for( long int  i =0; i< len; i++)
    {
        cur_len += 1;
        while(que_find(que, s+i, len))    //注意这个循环,它的作用是循环将与*(s + i)相同的元素删除
        {
            *(que + start) = 0;       //delete
            start += 1;
            cur_len -= 1;
        }
        *(que + end) = *(s + i);        //元素入队
        end += 1;
        if(cur_len > max_len)          //记录最长子串
            max_len = cur_len;

    }

    return max_len;
}

 滑动窗口算法主要应用对象:数组和字符串

结合滑动窗口算法的说明和本例题,可知滑动窗口算法可以用来解决一些查找满足一定连续区间的性质(长度)的问题,

因此当区间发生了变化(不满足给定条件)时,可以通过旧有的计算结果(窗口)对搜索空间进行剪枝,从而达到减低时间复杂度的效果

类似于“找到满足 xx 的最 x 的区间(子串、子数组)的 xx”的问题,都可以使用滑动窗口解决。

注意:滑动窗口是一种思想、算法,不用拘泥于数据结构。(不一定要用队列求解本例)

滑动窗口基本框架 

  • 滑动:窗口是移动的,方向是我们根据要求自己设定
  • 窗口:窗口大小不一定是固定的,它可以随时改变,根据需要扩大(直到满足一定条件)或缩小(直到找到一个满足条件的最小窗口);也能保持固定        

 结合本题,深入理解滑动窗口算法,并将其抽象

  1. 我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」
  2. 我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(无重复字符)
  3. 此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(直到与*(s+i)无重复)。同时,每次增加 left,我们都要更新一轮结果。

  4. 重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头

以下是更高效的程序例程

int lengthOfLongestSubstring(char * s)
{
    
    int len = strlen(s);

    if (len <= 1) {
        return len;
    }

    char *left = &s[0];
    char *right = &s[0];    //滑动窗口左右指针
    int maxLen = 0;
    int map[256] = {0};
    memset(map, 0, sizeof(map));
    for (int i = 0; i < len; i++) {
        map[*right]++;        //根据每个字符对应一个ASCII码,每次遍历对应键的值就加1(类似于哈希表)

        while(map[*right] > 1) {  //超过1,说明字符重复,左指针右移
            map[*left]--;
            left++;
        }

        right++;

        maxLen = maxLen < (right - left) ? (right -left) : maxLen;
    }

    return maxLen;
}

 

 

 

 

附:

 参考文章:滑动窗口算法基本原理与实践 - huansky - 博客园 (cnblogs.com)

标签:子串,字符,right,窗口,int,len,滑动,最长,left
From: https://www.cnblogs.com/hk-to-try/p/17198892.html

相关文章

  • 算法训练Day9| LeetCode28. 找出字符串中第一个匹配项的下标(KMP算法)
    28. 找出字符串中第一个匹配项的下标给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从0开始)。如果......
  • 获取时间字符串
    importtimeimportdatetimedefget_time_str():#定义文件名,年月日时分秒随机数#fn=time.strftime('%Y%m%d%H%M%S')#fn=fn+'_%d'%random.r......
  • Go字符串方法
    字符串常用方法都在strings包中高性能字符串拼接varbuilderstrings.Builderbuilder.WriteString("用户名")builder.WriteByte(97)str:=builder.String()fmt.......
  • Python基本语法 -- 变量、运算、字符串
    对象要存储一个对象需要包括id(标识,对象一旦创建id永不改变,在内存中的位置)、type(类型,当前对象的类型,决定其功能)和value(值,存储的具体值)根据其值能否更改进行分类,可分为可......
  • MySQL如何指定字符集和排序规则?
    在MySQL中,可以使用以下两种方式指定字符集和排序规则:创建数据库或表时指定字符集和排序规则在创建数据库或表时,可以使用CHARACTERSET和COLLATE选项......
  • MySQL字符集 utf8 和 utf8mb4 有什么区别?
    UTF-8是一种Unicode字符集编码方式,用于存储和传输Unicode字符。MySQL支持UTF-8字符集,但在MySQL5.5.3之前,它只支持最多三个字节的UTF-8编码(也称为“utf8”字符集),因此无法存......
  • IO流(二)之字符流、缓冲流、转换流、打印流,数据流,序列化流,File和IO工具包
    通过名字就很高区分,前面的单词代表着功能,后面的代表着类别一、字符流字节流:适合复制文件等,不适合读写文本文件字符流:适合读写文本文件内容具体的原因我们在前面的内......
  • 字符串查询【华东师范大学考研机试题】
    字符串查询给你单词S和Q个询问。每次询问,你会得到正整数A,B,C和D。我们令单词X由S的第A到B个字母组成,单词Y由S的第C到D个字母组成。你需要回答......
  • P4551 最长异或路径
    给定一棵nn个点的带权树,结点下标从11开始到nn。寻找树中找两个结点,求最长的异或路径。异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 处理出每个点......
  • 字符串专题
    字符串前言假期的时候刷了点字符串的专题,感觉板子变得更加普适和完善了KMPkmp算法实际上就是找最长公共前后缀,之前一直都是用的acwing的板子,根据董晓算法的板子和自己......