其实是个很easy的问题,但是当时的code就是写的很垃圾,提示再三才写了这么一个code,应该还有可以improve的空间。
典型的双指针问题,一前一后找substring,这里要考虑如何节省空间,尽可能的少存解。要求 one loop
例如 abcdefg....xyzz
input"thiisiissoodd", returns i i s o d
input2 "thiiissisoodd" return i
public static ArrayList<Character> longestSubstr2(String s){
int maxlen = 0;
ArrayList<Character> res = new ArrayList<Character>();
if(s == null || s.length() == 0) return res;
if(s.length() == 0){
res.add(s.charAt(0));
return res;
}
//two pointer to loop
int prev = 0;
for(int i = 1; i <= s.length(); i++){
//pay attention to last
if(i < s.length() &&s.charAt(i) != s.charAt(prev) ){
//update
if(i - prev > maxlen){
//only put in map if > maxlen
res = new ArrayList<Character>();
}
maxlen = Math.max(maxlen, i - prev );
if(i - prev == maxlen) res.add(s.charAt(prev));
prev = i;
}else if(i == s.length()){
if(i - prev > maxlen){
//only put in map if > maxlen
res = new ArrayList<Character>();
}
maxlen = Math.max(maxlen, i - prev );
if(i - prev == maxlen) res.add(s.charAt(prev));
}
}
return res;
}