题目以及相关提示:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "cccc"
输出: 1
解释: 因为无重复字符的最长子串是 "c",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
建议使用滑动窗口解法:
-
滑动:说明这个窗口是移动的,也就是移动是按照一定方向来的。
-
窗口:窗口大小并不是固定的,可以不断扩容直到满足一定的条件;也可以不断缩小,直到找到一个满足条件的最小窗口;当然也可以是固定大小
/*
* 无重复字符的最长子串
* */
public class LeetCodeThree {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;//最长子串长度
int left = 0;//滑动窗口左下标,i相当于滑动窗口右下标
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
left = Math.max(left,map.get(s.charAt(i)) + 1); //map.get():返回字符所对应的索引,当发现重复元素时,窗口左指针右移
} //map.get('a')=0,因为map中只有第一个a的下标,然后更新left指针到原来left的的下一位
map.put(s.charAt(i),i); //再更新map中a映射的下标
max = Math.max(max,i-left+1); //比较两个参数的大小
}
return max;
}
}
后续会增加其他解法,以及详尽介绍!