题目描述
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.
给出字符串中最长无重复字符的子串的长度。
解题思路
为了求得最长无重复字符的子串的长度,我们可以用一个int型数组来存放字符出现的位置,如果值为-1,说明字符还未出现过;用start 来记录最长无重复子串起始位置
用maxLen 来记录最长无重复子串最大长度;用变量i来遍历字符串;在一次循环中实现如下功能:
用maxLen 来记录最长无重复子串最大长度;用变量i来遍历字符串;在一次循环中实现如下功能:
- 如果当前字符未出现,则数组中记录当前字符出现的位置,i++;
- 如果当前字符已出现,比较i - start和maxLen,如果大于则更新maxLen,同时将start和i更新到当前字符上一次出现的位置的后一位,位置数组归零;
需要注意的是按上述方法可能会忽略最后一个无重复子串(字符串尾部),所以需在循环结束后判断一下;
代码
/**
* 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",
* whichthe length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0)
return 0;
if (s.length() == 1)
return 1;
int n = s.length();//数组长度
int[] charPos = new int[128];//记录ASCII码出现的位置
int start = 0;//最长无重复子串起始位置
int maxLen = 0;//最长无重复子串最大长度
int i = 0;
Arrays.fill(charPos, -1);//初始值置为-1
while(i < n){
int ch = s.charAt(i) - 0;
if(charPos[ch]!=-1){
//如果[start,i)的子串长度大于maxLen,则更新maxLen
if(i - start > maxLen)
maxLen = i - start;
//start更新为重复字符的后一个位置
start = charPos[ch] + 1;
//i更新为重复字符的后一个位置,以便能够重新更新charPos
i = charPos[ch] + 1;
//置为初始值
Arrays.fill(charPos, -1);
} else {
//记录出现字符的位置
charPos[ch] = i;
i++;
}
}
//判断以字符串末尾结尾的无重复字符子串的长度是否大于maxLen
if(i - start > maxLen)
maxLen = i - start;
return maxLen;
}