题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题思路—使用LinkedHashMap:使用hashmap判断有没有重复字符,并且使用LinkedHashMap的特性顺序存储输出。要特别注意的是:hashmap的循环遍历删除要使用迭代器Iterator,否则删除的时候会报错(因为删除后当前map的版本号与进入循环的版本号不一样,系统会检测出来报错)。
解题思路—滑窗循环判断:新加入一个字符时,在之前的字符串中判断有没有重复,若有重复,调整左右门槛下标。
解题思路—使用队列:使用contains判断队列有没有重复字符,如果有,从队首顺序弹出相应元素。
Java解题—使用LinkedHashMap
import java.util.LinkedHashMap;
import java.util.Iterator;
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0)
return 0;
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
int max = 0;
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
// hashmap循环遍历删除,需要使用迭代器
Iterator iter = map.keySet().iterator();
while(iter.hasNext()){
if((char)iter.next()!=s.charAt(i))
iter.remove();
else{
iter.remove();
break;
}
}
}
map.put(s.charAt(i), null);
int length = map.size();
max = length>max?length:max;
}
return max;
}
}
Java解题—滑窗循环判断
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0)
return 0;
int ans = 1;
int max = 1;
int start = 0;
char[] cs = s.toCharArray();
int ind = -1;
for(int i = 1;i<cs.length;i++) {
ind = index(s, start, i, cs[i]);
if(ind==-1) {
max++;
ans = ans>max?ans:max;
}else {
max = max - (ind-start);
start = ind+1;
}
}
return ans;
}
public int index(String s,int start,int end,char ch) {
for(int i=start;i<end;i++)
if(ch==s.charAt(i))
return i;
return -1;
}
}
Java解题—使用队列
import java.util.Deque;
import java.util.LinkedList;
class Solution {
public int lengthOfLongestSubstring(String s) {
Deque<Character> characterDeque = new LinkedList<>();
int result = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (characterDeque.contains(c)) {
int len = characterDeque.size();
result = len>result?len:result;
while (c != characterDeque.peek())
characterDeque.poll();
characterDeque.poll();
}
characterDeque.add(c);
}
int size = characterDeque.size();
return size > result ? size : result;
}
}