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.
题意:给出一个字符串,找到最长不含重复字符的子串。
思路:设定两个下标i,j。i指向子串的第一个字符,j指向子串最后一个字符。i和j初始时都指向父串的第一个字符,j逐个向后移动,并且同时维护maxLength,当遇到某个字符与之前的第k个字符相同,则将i移动到第k+1个。虽然有两个while循环,但是算法复杂度仍为O(n)。
public int lengthOfLongestSubstring(String s) {
if(s.equals("")){
return 0;
}
int maxLength = 1;//排除了空串的情况下,最小长度就为1
int i = 0;
int j = 0;
boolean[] map = new boolean[300];//标记数组
char[] charArray = s.toCharArray();//转换为字符数组
map[charArray[0]] = true;//第一个先设为有
while(j < s.length() - 1){
j++;
while (map[charArray[j]]){//当j遇到某个之前已经出现过的字符,则i++只到跳过那个字符
map[charArray[i]] = false;
i++;
}
map[charArray[j]] = true;//子序列中新增一个字符
maxLength = Math.max(maxLength, j - i + 1);//维护maxLength
}
return maxLength;
}