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

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

包含测测试用例:

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

原文地址:https://www.cnblogs.com/pigdragon/p/12393029.html

时间: 2024-07-29 12:32:16

计算无重复字符的最长子串的相关文章

代码题(56)— 最长重复子串、无重复字符的最长子串

1.最长的重复子串 寻找一个字符串中最长的重复子串 最大后缀方法思路: 1. 用字符串指针数组保存用户输入的字符串的所有后缀字符串: 2. 将后缀字符串集合进行排序: 3. 比较相邻字符串的公共子串长度,找到长度最大值,保存相应字符串即为所求 空间复杂度:求长度为n的字符串的后缀,需要O(n)的空间复杂度  时间复杂度:产生后缀数组-时间复杂度O(N).对后缀数组排序是O(N*NlogN),第一个N表示字符串的比较,后面NlogN使用快排排序.依次检测相邻两个后缀的公共长度-时间复杂度O(N*N

Leetcode——3. 无重复字符的最长子串

难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度. 示例?1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字

【Leetcode】【Longest Substring Without Repeating Characters】【无重复字符的最长子串】【C++】

题目:给定一字符串,求其无重复字符的最长子串长度. 思路:for循环一次,时间复杂度为O(N).字符的ascii值为32~126.start表示当前无重复字符子串的初始位置,初始值为0:可定义一个位置数组pos[128]表示for循环索引到当前位置时相应的字符对应的位置.若当前字符s[i](其ascii值为cur_pos),若pos[cur_pos]>=start,说明在start之后已有该字符s[i],则以start开始的子串第一次遇到重复字符,打住.判断当前长度是否大于max_len,若大于

[LeetCode]无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 无重复字符的最长子串是 "b",其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 无重复字符的最长子串是 "wke",其长度为 3.   请注

[Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1.

LeetCode 无重复字符的最长子串(探索字节跳动)

题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "w

BAT面试算法进阶(2)- 无重复字符的最长子串(暴力法)

一.算法题 题目 Given a string, find the length of the longest substring without repeating characters. Example Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length

领扣-无重复字符的最长子串-Python实现

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke&qu

LeetCode 第3题 无重复字符的最长子串

/*3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 &qu