LeetCode 100题题解(JAVA) 之 无重复字符的最长子串

# LeetCode 100题题解(JAVA) 之 无重复字符的最长子串

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:简单记录一下答案和思路。


提示:以下是本篇文章正文内容,下面案例可供参考

简单记录一下答案和思路,答案有借鉴网络.

一、两数之和

题目描述:

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

示例 1:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

二、解题思路

1.使用HashMap

1.声明一个HashMap接收字符串数值,key存字符值,value存字符串中字符的下标.
初始化start和end,分别表示两个位置,均从0开始,end最大不超过字符串的长度. start表示不重复字符的开始位置,end表示不重复字符的截止位置;声明一个ans保存长度
2.对map进行for循环,取出字符串中的字符,存为alpha,开始判断map中是否包含刚才取出的字符
3.第一次,map为空,肯定不包含,将字符存入,并向后移一位end,start位置不变,此时最大长度为

ans = Math.max(end - start+1 ,ans)

4.如果包含,说明Map中有一个数(之前存入Map中数组中的值)与遍历end坐标上的字符一样, 之前不重复的长度已经存到ans中了,因为已经出现了重复的字符,此时要更新start开始进行下一个不重复子字符串的新起点,用于长度的计算.
当end遍历到的位置的字符值,在end中已经存在,说明 start和end是首尾重复了,他们之间的长度已经不是非重复子串了,此时要更新start的位置,然后再计算长度.
5.start始终记录的是字符串中非重复字符串的开始位置
疑问:
更新start的值为多少?
start应该在重复字符的上一个字符的基础上后移一位.
map.get(alpha)记录的是重复字符上一次出现的下标,它的下一位就应该作为非重复子字符串的开始位置
举例 “wkewy” ,开始start在0,此时存入map中的也是(w,0),但是当end遍历到下一个w,也就是end=3时, 此时子串为wkew,显然有重复,所以要先更新start, 就是上一次w的下标+1,上一次w的下标保存在map中,通过map.get(key)获取
上一次重复字符的位置+1,作为start的位置.

2.代码如下

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<>();
        int n = s.length(),ans = 0;
        for(int end = 0 ,start = 0 ; end < n; end ++ ){
            //拿到s的第end个字符
            char alpha = s.charAt(end);
            //如果HashMap中包含这个字符,则说明出现重复
            if(map.containsKey(alpha)){
                //更新start为当前出现重复的位置
                //这里要存map.get(alpha)+1是因为这个alpha保存的是map中end对应位置的value,这个值是在上次保存到map中的end,所以
                start = Math.max(start,map.get(alpha)+1);                     
            }
            //更新长度,取之前的长度和 现在 长度的 较大值
            ans = Math.max(end - start +1,ans);
            //将当前的字符和字符的位置end 放入map中
            map.put(alpha,end);
        }
        return ans;
    }
}

总结

提示:这里对文章进行总结:

关键是对HashMap的使用,搞清楚key和value存什么,以及将两数和的条件翻译成代码:

map.containsKey(target - nums[i])

其实也很简单,将数组和HashMap联合起来使用就行,我觉得编程有一个思想很关键,就是将旧的值的,或者说遍历到的值,存入一个容器(变量,便于理解但说法不准确),以后要用到的时候可以方便调用. 比如讲num[0]存入HashMap中,之后就的循环也会用到该值进行判断.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值