Longest Substring Without Repeating Characters
题目链接:
https://leetcode.com/problems/longest-substring-without-repeating-characters/
题目要求是,求出最长无重复子序列的长度。
比如:
maxLen(abba) = 2;
maxLen(pawwakew) = 4;
maxLen(leetcode) = 5;
解题思路:
利用哈希表,定义一个数组charIndex[128],用来保存对应位置的字符的最新下标,每次该数组被更新时,说明遇到了重复字符。
定义3个变量start、to、maxLen,start用来表示不重复字符的开始位置,当遇到重复字符时,更新start的值;to用来遍历字符串数组,maxLen用来记录最大无重复的子序列的长度。
另外,还要注意几种特殊情况。
代码如下:
public int lengthOfLongestSubstring(String s) {
if(s.equals(""))
return 0;
if(s.length() == 1)
return 1;
int start = 0, to = 0; // start无重复子序列的开始位置;to用于遍历字符串
int maxLen = 1; // 无重复子序列的最大长度
int[] charIndex = new int[128]; // 记录对应字符的最新下标
for(int i = 0; i < 128; i ++)
charIndex[i] = -1;
for(to = 0; to < s.length(); to ++) {
int repeatIndex = charIndex[s.charAt(to)]; // 找到数组charIndex中该字符对应的位置
// 如果该位置不为-1,表示遇到了重复字符
if(repeatIndex >= start && repeatIndex != -1) {
if(to - start > maxLen)
maxLen = to - start;
start = repeatIndex + 1; // 改变start的值
}
// 处理边界情况
if(to == s.length() - 1) {
if(to - start + 1 > maxLen)
maxLen = to - start + 1;
}
// 每次遍历,无论该字符是否重复,都一律记录其位置
charIndex[s.charAt(to)] = to;
}
return maxLen;
}

浙公网安备 33010602011771号