高频面试算法典型题- 01 最长子串

74 阅读1分钟

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

题目来源:力扣

示例 1:

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

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

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

输入: s = "" 输出: 0

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:滑动窗口求解,当遇到重复子串时,重置窗口左边界

public class MaxSubString {
    public static int lengthOfLongestSubstring(String s) {
        int windowLeft = 0;
        int maxStringLength = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(s.charAt(i))){
                // 子串的窗口边界
                windowLeft = Math.max(windowLeft,map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i),i);
            maxStringLength = Math.max(maxStringLength,i - windowLeft + 1);
        }
        return maxStringLength;

    }

    public static void main(String[] args) {
        int length = lengthOfLongestSubstring("asdfgasasas");
        System.out.println(length);
    }
}