https://leetcode.com/problems/longest-substring-without-repeating-characters/
数组问题
Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
分析:要求其中不含有重复字符的 最长子串的长度,本质上是滑动窗口的问题;
1、使用队列Queue
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s ==null || s.length()==0) return 0;
int result = 0;
Queue<Character> queue = new LinkedList<Character>();
for(char c : s.toCharArray()){
while (queue.contains(c)) {
//此处while循环 - 如果有重复的,队头出队
queue.poll();
}
queue.offer(c);
result = Math.max(result,queue.size());
}
return result;
}
}
2、使用Set(HashSet)
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s ==null || s.length()==0) return 0;
int l=0,r=-1;
int result = 0;
char[] array = s.toCharArray();
Set<Character> set = new HashSet<>();
//注意边界条件
while(l<s.length()){
if(r+1<array.length && !set.contains(array[r+1])){
set.add(array[++r]);
result = Math.max(result,r-l+1);
}else{
//l++直到重复的值(以及重复值之前的数据 1(1x23)x11 -> 11x(23x)11 )刨除出去!
set.remove(array[l++]);
}
}
return result;
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s ==null || s.length() == 0) return 0;
int result = 0;
char[] array = s.toCharArray();
Set<Character> set = new HashSet<> ();
//右边添一个,左边可能动多个
for (int l = 0, r = 0; r<array.length ; r++){
while (set.contains(array[r])) {
set.remove(array[l++]);
}
set.add(array[r]);
//set.size()
result = Math.max(result, r - l + 1);
}
return result;
}
}
3、使用Map(HashMap)
class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0;
Map<Character,Integer> map= new HashMap<>();
for(int l = 0,r = 0;r < s.length(); ){
if(map.containsKey(s.charAt(r))){
//更新left索引下标
l = Math.max(map.get(s.charAt(r)),l);
}
res = Math.max(res,r-l+1);
//更新map最新值 (覆盖)
map.put(s.charAt(r),++r);
}
return res;
}
}