【Leetcode刷题】 DAY2 无重复字符的最长子串

1、无重复字符的最长子串

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

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

(1)思路:使用滑动窗口方法。
①创建一个个 HashMap 对象 map, 字符型(Character)的 key 和整型(Integer)类型的 value,前者用来存储字符串,后者用来存储位置。
②创建左右指针,并遍历这个字符串。
③右指针移动,并将字符存入map中。其中,字符为key,字符的位置为value。
④在将字符串存入map之前,需要判断map中是否已经存在该字符。如果map中已经存入过某个字符,则比较原start和map中该重复数值的位置的数值,选取大的那个给start赋值。(即,将左指针向右移动,选取大的那一个是为了避免指针向左移动)
⑤计算现在map中字符串的长度。完成后,end指针继续向后移动,直到end移动到字符串的最后。

(2)下面涉及的部分函数:
①charAt() 方法用于返回指定索引处的字符。
②containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。
③Math.max() 函数返回一组数中的最大值。
④ Map.get() 方法返回指定键所映射的值。
⑤put() 方法将指定的键/值对插入到 HashMap 中。eg:map.put(K key,V value)

  public int lengthOfLongestSubstring(String s) {
        int lens = 0, n = s.length();
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for (int end = 0, start = 0; end < n; end++) {
            char temp = s.charAt(end);//返回字符右指针对应的字符
            if (map.containsKey(temp))//判断map中是否存在该字符
             {
                start = Math.max(start, map.get(temp));//Math.max()作用是选取两个参数之间的最大值
            }
            lens = Math.max(lens, end - start + 1);//
            map.put(temp, end + 1);//将end索引位置上的字符放进map表,这里进行加一是为了保证,如果后续有重复的字符出现,左指针会移动到该字符下一个开始。
        }
        return lens;
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值