• 计算无重复字符的最长子串


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

    包含测测试用例:

    示例 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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    swift
    swift
    c# 根据自定义Attribute排序
    asp.net 导出excel
    算法时间复杂度的计算 [整理]
    再谈javascript原型继承
    深入学习JavaScript: apply 方法 详解(转)——非常好
    Chapter 6 : Control Statements : Looping
    Chapter 6 : Applications of Definite Integrals
    朋友圈仅三天可见?怎么破?
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12393029.html
Copyright © 2020-2023  润新知