Longest Substring Without RepeatingCharacters
题意:输入一个字符串,输出这个字符串的某个最长的子串,子串符合里面所有出现字母出现次数不超过1次。
解法:暴力就不说了。
O(n):从头至尾遍历每个char,找到当前这个char结尾的最长子串长度。维护一个hashtable来记录当前某个字符是否在当前子串中,初始时都为-1。当某个char不在当前子串时,将该char添加到该子串中,当已存在时,把子串开头到曾经该char出现的位置的字符在hashtable中的位置全部置为-1,再将该char的当前位置的位置记录。由于hashtable的get(key)与put(key,value)操作理论上平均为O(1),而每个char最多入,出hashtable各一次,所以总的复杂度为O(N)。
import java.util.Hashtable;
public class Solution149 {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0){
return 0;
}
if (s.length()==1){
return 1;
}
Hashtable<Character,Integer> hash=newHashtable<Character,Integer>();
for (int i=0;i<256;i++){
hash.put((char)i, -1);
}
int ans=1;
int start=1;
hash.put(s.charAt(0), 1);
int n=s.length();
for (int i=2;i<=n;i++){
if(hash.get(s.charAt(i-1))==-1){
hash.put(s.charAt(i-1),i);
if(i-start+1>ans){
ans=i-start+1;
}
}else{
intpos=hash.get(s.charAt(i-1));
for (intj=start;j<=pos;j++){
hash.put(s.charAt(j-1),-1);
}
start=pos+1;
hash.put(s.charAt(i-1),i);
}
}
return ans;
}
}