hashtable
题目描述:
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.
思路:双指针做法:
用一个大小为257的int数组存放字符出现的次数,用作hashmap,key是字符,value是次数
hou指针往后遍历:遍历当前字符有两种情况:
(1)当前字符已经存在了,那么就让qian指针从前往后走,并删除,直到遇到相同的字符的时候
(2)当前字符没有存在,那么就让hou指针往后走,并且更新len
public static int lengthOfLongestSubstring(String s) {
if(s.length() == 0) return 0;
if(s.length() == 1) return 1;
int len = 0;
int qian = 0;
int hou = 0;
int [] map = new int[257];
while(hou<s.length()){
map[s.charAt(hou)]++;
if(map[s.charAt(hou)] > 1){
//一定是前面有重复的了,需要让qian往后移动
while(map[s.charAt(qian)]==1){
map[s.charAt(qian)]--;
qian++;
}
map[s.charAt(qian)]--;
qian++;
hou++;
}else {
//没有重复,就让hou往后移动,然后len改变一下
hou++;
len = Math.max(len , hou-qian);
}
}
return len ;
}
public static void main(String[] args) {
int res = lengthOfLongestSubstring("abcabcbb");
System.out.println(res);
}