Related Topics:[Hash Table][Two Pointers][String]
Similar Questions
[Longest Substring with At Most Two Distinct Characters]
题目:Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
思路
设置两个指针,分别标识字符串中不重复子字符串的左部和右部。右指针不断向后移动,并将查找过的元素存下来,同时更新长度。当右指针所指元素已查找过时,将左指针移动到重复元素的后一位。
根据存储已查元素的不同,可以有以下三种解法:
解法1
使用set,把出现过的字符都放入set中,遇到set中没有的字符就加入set中并更新结果,如果遇到重复的,则从左边开始删字符,直到删到重复的字符停止。
java解法1
class Solution {
public int lengthOfLongestSubstring(String s) {
int l=0,left=0,right=0;
//滑动窗口解法1:set结构
Set<Character> set=new HashSet<>();
while(right<s.length()) {
if(!set.contains(s.charAt(right))) {
set.add(s.charAt(right++));
l=l>set.size()? l:set.size();
}else {
//左指针向右移动,直到移动到重复元素
set.remove(s.charAt(left++));
}
}
return l;
}
}
解法2
使用map,直接跳到重复的字符之后。
java解法2
//滑动窗口解法2:map结构
Map<Character,Integer> map=new HashMap<>();
int l=0;
//i为left j为right
for(int i=0, j=0;j<s.length();j++) {
if(map.containsKey(s.charAt(j))) {
i=Math.max(i,map.get(s.charAt(j))+1);
}
l=Math.max(l,j-i+1);
//根据map的性质,当存储重复元素时,新的value值即索引将会覆盖旧值
map.put(s.charAt(j),j);
}
return l;
解法3
利用ASCII编码,使用256大小数组存储各字符索引。
java解法3
//滑动窗口解法3:数组存储ASCII
int[] m=new int[256];
int l= 0;
// try to extend the range [i, j]
for (int j = 0, i = 0; j < s.length(); j++) {
i = Math.max(m[s.charAt(j)], i);
l = Math.max(l, j - i + 1);
m[s.charAt(j)] = j + 1;
}
return l;