Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
思路:
滑动窗口设计思想:
创建一个ArrayList类型的list,遍历字符串,一个个将字符加入进来,遇到重复的字符,则执行回退操作,然后清空list
进入下一个循环,继续将不重复的字符加入进去。
每次需要记下list的大小,比较得到最长的longest subString的长度
比如字符串"wlrbbmqcmdghy"
窗口变化情况为:"wlrb" ->"" -> "bmqc" -> "" -> "qcmdghy"
(1)list窗口包含字符串"wlrb",继续遍历发现重复的字符b,则索引i退回到第一个字符b的位置,即3,清空list
(2)i++,当前索引位置前进一位变为4,即遍历到第二个b字符,从第二个b字符开始遍历,加入不重复的字符
(3)list窗口包含字符串 "bmqc",继续遍历发现重复的字符m,则索引i退回到第一个字符m的索引位置,即5,情况list
(4)i++,索引前进一位,遍历到第字符q字符,从字符q开始遍历,加入不重复的字符
Java代码实现
import java.util.ArrayList;
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0)
return 0;
int len = s.length();
int longest_len = 0;
ArrayList<Character> list = new ArrayList<>();
for(int i = 0; i < len; i++){
if(!list.contains(s.charAt(i))){
list.add(s.charAt(i));
//每次比较得到最大长度
if(list.size() > longest_len){
longest_len = list.size();
}
}
//回退到重复的字符位置,并清空list
else{
int inner_index = list.indexOf(s.charAt(i));
i = i - (list.size() - inner_index);
list.clear();
}
}
return longest_len;
}
}