和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ48-最长不含重复字符的子字符串

原题链接


## 描述

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


示例

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

思路

动态规划。用一个HashMap 记录每个字符上一次出现的位置,repeatMin获取重复字符出现的最大下标。

具体见注释。


解答

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 0) return 0;

        int res = 1;//最大值
        int repeatMin = -1;
        int[] dp = new int[s.length()]; // dp[i]表示截止s[i]能表达的最大长度
        dp[0] = 1;
        HashMap<Character, Integer> hashMap = new HashMap<>();
        hashMap.put(s.charAt(0), 0);

        for (int i = 1; i < s.length(); ++i) {
            // 获取最近出现下标,没有的话是-1
            int dist = hashMap.getOrDefault(s.charAt(i), -1);
            repeatMin = Math.max(repeatMin, dist);
            // 更新该字符出现位置
            hashMap.put(s.charAt(i), i);
            // 更新当前字符的最大长du
            dp[i] = repeatMin == -1 ? dp[i - 1] + 1 : i - repeatMin;
            // 计算最大值,
            res = Math.max(res, dp[i]);

        }
        return res;
    }
}
posted @ 2021-09-20 09:46  klaus08  阅读(36)  评论(0编辑  收藏  举报