LeetCode刷题笔记:3.无重复字符的最长子串

1. 问题描述

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

2. 解题思路

1、首先,判断当前字符是否包含在 map 中,如果不包含,将该字符添加到 map <字符,字符在数组下标>,此时没有出现重复的字符,左指针不需要变化。此时不重复子串的长度为:rightBorder - leftBorder + 1,与原来的 len 比较,取最大值;

2、如果当前字符 ch 包含在 map 中,此时有 两 类情况:
1)当前字符包含在当前有效的子段中,如:abca,当我们遍历到第二个 a,当前有效最长子段是 abc,我们又遍历到a,那么此时更新 leftBorder 为 map.get(‘a’) + 1 = 1,当前有效子段更新为 bca;
2)当前字符不包含在当前最长有效子段中,如:abba,我们先添加 a, b 进 map,此时 leftBorder = 0,我们再添加 b,发现 map 中包含 b,而且 b 包含在最长有效子段中,就是 1)的情况,我们更新 leftBorder=map.get(‘b’)+1=2,此时子段更新为 b,而且 map 中仍然包含 a,map.get(a)=0;随后,我们遍历到 a,发现 a 包含在 map 中,且map.get(a)=0,如果我们像 1)一样处理,就会发现 leftBorder=map.get(a)+1=1,实际上,leftBorder 此时应该不变,leftBorder 始终为 2,子段变成 ba 才对。

为了处理以上两类情况,我们每次更新 leftBorder,leftBorder=Math.max(leftBorder , map.get(ch)+1).
另外,更新left后,不管原来的 s.charAt(i) 是否在最长子段中,我们都要将 s.charAt(i) 的位置更新为当前的 i,因此此时新的 s.charAt(i) 已经进入到 当前最长的子段中。

3. 代码实现

import java.util.HashMap;

public class Solution3 {
    public int lengthOfLongestSubstring(String s) {
        int len = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        // 左边界
        int leftBorder = 0;
        // 有边界
        for (int rightBorder = 0; rightBorder < s.length(); rightBorder++) {
            // 如果 Hashmap 中已经存在该字符,则 左边界 右移 一个位置
            if (map.containsKey(s.charAt(rightBorder))) {
                // 更新左边界
                leftBorder = Math.max(leftBorder, map.get(s.charAt(rightBorder)) + 1);
            }
            map.put(s.charAt(rightBorder), rightBorder);
            // 更新最大长度
            len = Math.max(len, rightBorder - leftBorder + 1);
        }

        return len;
    }

    public static void main(String[] args) {
        String s = "abcabcbb";
        Solution3 solution3 = new Solution3();
        System.out.println(solution3.lengthOfLongestSubstring(s));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值