首页 > 技术文章 > 计算无重复字符的最长子串

pigdragon 2020-03-01 23:41 原文

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

包含测测试用例:

示例 1:

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

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

本人验证提交的代码如下:

该代码为C语言版本

int lengthOfLongestSubstring(char * s){
    int i;
    int max = 0;
    int left = 0;// 左边窗口的边界
    int table[256]; 
    int tmp=0;
  int len = strlen(s);
    for(i=0;i<256;i++){
        table[i]=-1;
   }

    for(i = 0; i < len; i++){// 控制的是右边窗口的边界
        int index = s[i];
        if(left<= table[index]&& table[index] <= i){ // 判断是否发生的重复字符
                left=table[index]+1; // 更新左边窗口的边界值
        }
        tmp=i-left+1; // 计算当前滑动窗口的大小
        max=tmp>max?tmp:max;// 更新最大子串长度
        table[index]=i; // 记录当前字符在字符串中的下标
    }
    return max;
}
题解思路:
  在该题目中主要用到了滑动窗口的概念,首先针对这个字符串,我们需要做的是通过一次的遍历来找出最大的子串长度,从而实现时间复杂度为O(N)的算法实现,
在此过程中,将字符串的起始位置设为滑动窗口的左边界,I值作为滑动窗口的右边界,I也就是字符串的下标,在遍历的过程中,我们将当前字符对应的ASCII码
作为了table中的index值,其中的table相当于一个哈希表,每一个元素的value,就是这个字符在字符串中的下标位置,在遍历的时候,每遍历一个字符,我们
都需要计算当前的窗口大小,然后拿当前窗口大小与max值做比较,进行更新,现在问题的关键是,如何控制滑动串口左边界的值,因为滑动窗口的右边界是实时变化的
随着I的增加,可以看到,当发现当前字符在table中对应的值,在窗口之间的时候,就可以判断,发生了字符的重复,需要去更新滑动窗口的左值,那么如何更新呢?
直接将发生碰撞的那个字符在table中的value取出,然后,将value+1赋给left,就是新的左边窗口大小了;在遍历的时候,只要将右边界减去左边界加1就可以计算出当前
窗口大小,然后对最大子串的长度进行更新。
遇到的问题:
1:比较弱智的是,当前在对int型的数组进行初始化的时候,写的是 int table[256]={-1},想要初始化为-1,只能for循环对于C语言而言;


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

推荐阅读