每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度中等
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
import java.util.HashMap;
import java.util.Map;
/**
* 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
* <p>
* 示例 1:
* <p>
* 输入: "abcabcbb"
* 输出: 3
* 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
* 示例 2:
* <p>
* 输入: "bbbbb"
* 输出: 1
* 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
* 示例 3:
* <p>
* 输入: "pwwkew"
* 输出: 3
* 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
* 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
*/
public class LengthOfLongestSubstring {
public static int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int maxSize = 0;
int n = 0, lSize = 0;
for (int i = 0, start = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
/*
因为map里面包含了后面的字母,那么一定存在这样的情况
比如我的字母是qwerdfaqa,我们是从最开始的q往后开始循环
当我们循环到aq的时候,q是会进入循环的,那么后面就只有
从q开始出发,往后面走,不然q到q是肯定小于w
因为map有一个特性就是key唯一(qweoqgrxe)(abba)
*/
//我们先取到重复字段最开始对应的值,理解为最开始开始的字母
start = map.get(s.charAt(i));
/*在这里需要判断,就是abba这样的情况,如果不加下面的判断,
那么最后会返回3,本来结果应该是为2的
因为abba最开始重复的时候是b,然后取b出现的第一次是2
然后abba的第二次重复是a,但是a出现最开始的位置是1了,
所以a的第一次出现是在b的第一次出现后面,那么肯定
不可以取第一个a,如果取第一个a,那么他肯定b是重复的
*/
start = n > start ? n : start ;
//上面就是交换位置的情况
n = start ;
}
//这里取的是每次重复之后算出来的值
lSize = i + 1 - start ;
maxSize = maxSize > lSize ? maxSize : lSize ;
map.put(s.charAt(i), i + 1);
}
return maxSize;
}
public static void main(String[] args) {
System.out.println(lengthOfLongestSubstring("qwedsfmpoqgrxe"));//dsfmp qweoqgrxe
}
}
上一篇内容:每天一道算法题系列三之两数相加
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。