# 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中,之后就的循环也会用到该值进行判断.