21xrx.com
2024-11-23 12:13:49 Saturday
登录
文章检索 我的文章 写文章
无重复字符的最长子串
2023-06-08 17:41:05 深夜i     --     --

题目描述:

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

示例:

输入: "abcabcbb"

输出: 3

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

输入: "bbbbb"

输出: 1

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

输入: "pwwkew"

输出: 3

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

请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。

实现原理:

本题需要求出无重复字符的最长子串,可以使用滑动窗口的算法进行解决。

1. 定义一个left指针和一个right指针来确定滑动窗口的位置,让left指向子串的开头,right向右滑动。

2. 通过哈希表来存储当前子串中是否包含重复字符。

3. 如果哈希表中不包含right所指向的字符,则将其存入表中,并将最长子串长度与当前子串长度中的较大值进行比较,将较大值赋予最长子串长度。

4. 如果哈希表中已经包含right所指向的字符,则要从哈希表中删除left所指向的字符,并将left向右移动,直到哈希表中不再包含right所指向的字符。

代码及解释:

c++

class Solution {

public:

int lengthOfLongestSubstring(string s) {

unordered_map

int n = s.length();

int left = 0, right = 0;

int max_len = 0;

while(right < n){

if(hash.find(s[right]) != hash.end() && hash[s[right]] >= left){

left = hash[s[right]] + 1;

}

hash[s[right]] = right;

right++;

max_len = max(max_len, right - left);

}

return max_len;

}

};

使用unordered_map来存储字符是否存在,当出现重复字符时,需要将其对应的value值记录下来,即left = hash[s[right]] + 1,这样可以确保left指向之前出现重复字符的下一个位置,避免重复字符的计入。

  
  
下一篇: 解题思路

评论区

{{item['qq_nickname']}}
()
回复
回复