题目链接:
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; }