首页 > 其他分享 >力扣---剑指 Offer 48. 最长不含重复字符的子字符串

力扣---剑指 Offer 48. 最长不含重复字符的子字符串

时间:2023-03-15 17:33:31浏览次数:29  
标签:子串 字符 arr set 48 Offer int res ---

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

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

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

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

提示:
    s.length <= 40000
注意:本题与主站 3 题相同:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

标准双指针划窗解法。由于题目没有明确说明只包含asc字符,为了避免出现汉字等情况,需要用set来存储,而不能为了节省往set中添加和删除数据等时的时间开销而用数组代替。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 存储窗口中出现的字符。
        Set<Character> set = new HashSet<>();
        // 左指针,保存当前窗口开始时的位置。
        int p = 0;
        char[] arr = s.toCharArray();
        int res = 0;
        // i是右指针,保存当前窗口结束的位置。由于本题中,右指针只需要向右移动,不需要回退,所以直接用i代替。
        for (int i = 0; i < arr.length; i ++) {
            // 如果遇到窗口中已经存在字符了,那么一直移动左指针,直到窗口将该字符吐出来,维护窗口中字符的唯一。
            while (set.contains(arr[i])) {
                set.remove(arr[p]);
                p ++;
            }
            set.add(arr[i]);
            // 更新答案。
            res = Math.max(res, set.size());
        }
        return res;
    }
}

 

标签:子串,字符,arr,set,48,Offer,int,res,---
From: https://www.cnblogs.com/allWu/p/17219352.html

相关文章