0
点赞
收藏
分享

微信扫一扫

LeetCode3-无重复字符的最长字串

君之言之 2022-04-20 阅读 179
算法

1、问题描述


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

示例 1:
输入 : s = "abcabcbb"
输出 : 3
解释 :因为无重复字符的最长字串是 "abc" ,所以其长度为 3
 
示例 2:
输入 : s = "bbbbb"
输出 : 1
解释 :因为无重复字符的最长字串是 "b" ,所以其长度为 1
 
示例 3:
输入 : s = "pwwkew"
输出 : 3
解释 :因为无重复字符的最长字串是 "wke" ,所以其长度为 3
 
示例 4
输入 : s = ""
输出 : 0

提示:
 0 <= s.length <= 5 * 10^4
  s 由英文字母、数字、符号、和空格组成

2、解法分析


  滑动窗口,从左往右,如果没有发现重复字符则将窗口扩大,如果发现有重复字符则将窗口(最长字串)往右移。

  数组形式解法


    // 滑动窗口解法
    public static int interceptTheLongestString1(String s) {
        // 记录字符上一次出现的位置
        int[] last = new int[128];
        // 初始化值为 -1
        for (int i = 0; i < 128; i++) {
            last[i] = -1;
        }
        // 位移标志初始化
        int n = s.length(), res = 0, start = 0;

        //索引变量
        int sta = 0, end = 0, temp = 0;

        for (int i = 0; i < n; i++) {
            // 记录位置i 的ascall值
            int index = s.charAt(i);

            //记录临时res
            temp = res;

            //字符是否出现
            start = Math.max(start, last[index] + 1);
            res = Math.max(res, i - start + 1);

            //判定res 的值是否改变,有变更的情况就是最长字串变化的时候
            if (temp != res) {
                sta = start;
                end = i + 1;
            }

            //字符出现位置的索引
            last[index] = i;
        }
        //return s.substring(sta, end);
        return res;
    }

  哈希表解法

public static int lengthOfLongestSubstring(String s) {
        // 定义窗口左边界,左边界只能右移
        int startIndex = 0;
        // 最长子串长度
        int length = 0;
        // 哈希表存放 [char:index]
        Map<Character, Integer> hashMap = new HashMap<>();
        // 循环遍历
        for (int endIndex = 0; endIndex < s.length(); endIndex++) {
            Integer index = hashMap.get(s.charAt(endIndex));
            if (index != null) {
                //map 存在当前字符,则遇到重复字符,窗口需右移
                startIndex = Math.max(startIndex, index + 1);
            }
            // 更新字符的最新索引值
            hashMap.put(s.charAt(endIndex), endIndex);
            // 更新当前的最长子串长度
            length = Math.max(length, endIndex - startIndex + 1);
        }
        return length;
    }
举报

相关推荐

0 条评论