#LeetCode匠#无重复字符的最长子串

127 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。

由浅入深的解析最长子串长度的计算

题目描述

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

题目示例

题目解法

解法一:HashSet和List标识最长子串

内存消耗大、执行时间长。不推荐

/**
 * 动态规划-HashSet && List
 */
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 判空返回
        if(s == null || s.length() == 0){
            return 0;
        }
        // 标识无重复字串
        List<String> reBuildStr = new ArrayList<>();
        // 存储当前无重复子串的长度
        HashSet<Integer> reBuildHashSet = new HashSet<>();
        for(int i = 0; i < s.length(); i++){
            String curNum = String.valueOf(s.charAt(i));
            if (reBuildStr.contains(curNum)) {
                int index = reBuildStr.indexOf(curNum);
                // 生成最新的无重复子串
                reBuildStr = reBuildStr.subList(index + 1, reBuildStr.size());
            }
            reBuildStr.add(curNum);
            reBuildHashSet.add(reBuildStr.size());
        }
        // 获取最长子串
        return reBuildHashSet.stream().mapToInt(com->com).max().getAsInt();
    }
}

解法二:双指针+List标识核算最大子串长度

较解法一,节省了内存空间的消耗

/**
 * 双指针+List标识核算最大子串长度
 */
class Solution {
   public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }
        List<String> reBuildStr = new ArrayList<>();
        int curMaxSize = 0;
        int repeatIndex = -1;
        int maxValue = 0;
        for(int i = 0; i < s.length(); i++){
            String curNum = String.valueOf(s.charAt(i));
            if (reBuildStr.contains(curNum)) {
                int lastIndex = reBuildStr.lastIndexOf(curNum);
                if(lastIndex > repeatIndex){
                    curMaxSize = i - lastIndex -1;
                    repeatIndex = lastIndex;
                }
            }
            reBuildStr.add(curNum);
            curMaxSize++;
            maxValue = Math.max(curMaxSize, maxValue);
        }
        return maxValue;
    }
}

解法三:双指针+HashMap标识核算最大子串长度

较解法二,进一步提升了执行效率

/**
 * 双指针+HashMap标识核算最大子串长度
 */
class Solution {
   public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        HashMap<Character, Integer> buildMap = new HashMap<>();
        int maxLength = 0;
        int leftIndex = 0;
        for (int i = 0; i < s.length(); i++) {
            char curChar = s.charAt(i);
            if (buildMap.containsKey(curChar)) {
                leftIndex = Math.max(leftIndex, buildMap.get(curChar) + 1);
            }
            buildMap.put(curChar, i);
            maxLength = Math.max(maxLength, i - leftIndex + 1);
        }
        return maxLength;
    }
}

LeetCode原题链接:leetcode-cn.com/problems/cl…