Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, 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.
求最长的不重复子串,最开始用hashmap存,效率比较低,后来参考网上的解法,运用一个数组来保存字符出现的位置,速度提升了很多。
public static int lengthOfLongestSubstring2(String s) {
int[] pos=new int[256];
for(int i=0; i<pos.length; i++){
pos[i]=Integer.MAX_VALUE;
}
int re=0;
int count=0;
int start=0;
for(int i=0; i<s.length(); i++){
char chari=s.charAt(i);
int position=chari-' ';
if(i>pos[position]){//出现过
for(int j=start; j<pos[position]; j++){
pos[s.charAt(j)-' ']=Integer.MAX_VALUE;
count--;
}
start=pos[position]+1;
pos[position]=i;
}else{//没出现过
pos[position]=i;
count++;
if(count>re)
re=count;
}
}
return re;
}
总结:
1、数组在某种程度上也是哈希表,在这个题上用来记录字符出现的位置,如果是Integer.MAX_VALUE则代表没有出现过
2、unicode的第一个字符是空格而不是'!',这个问题上浪费了很多时间