其實是個很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;
}