C语言每日一题(68)无重复字符的最长字串

2024-04-15 09:12:35 浏览数 (2)

题目描述

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

示例 1:

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

示例 2:

代码语言:javascript复制
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子字符串是 "b",所以其长度为 1。

示例 3:

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

示例 4:

代码语言:javascript复制
输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

思路分析

知识点:滑动窗口

解析:

这也是一道经典的滑动窗口题,事实上滑动窗口模板是非常固定的,无非就是进窗口出窗口,然后判断条件,更新结果,每一道题的不同点都是在这四个方面。

1.首先如何判断我们取得的字串内有重复字符,利用哈希表,将每一个进窗口的字符进入哈希表,每当新字符进入时就判断一下哈希表上对应的值是否存在。

2.如果存在的话,此时就要出窗口,将left不断右移,每右移一个,就将对应字符的哈希表减1,直到重复字符的哈希表值为1即可。

3.此时更新结果。

代码语言:javascript复制
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left=0,right=0,n=s.size(),len=0;
        int hash[128]={0};
        while(right<n)
        {
            hash[s[right]]  ;
            while(hash[s[right]]>1)
            {
               hash[s[left  ]]--; 
            }
            len=max(len,right-left 1);
            right  ;
        }
        return len;
    }
};

0 人点赞