题目地址:无重复字符的最长子串
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
1.判断字符串的长度,长度小于等于1时,字符串不可能重复,return字符串的长度。
2.创建一个数组,用于存储字符上一次出现的位置,初始化为-1,-1表示第一次出现,数组长度128。
3.head和end变量用于存储无重复字符的最长子串开始和结束的位置,max存储无重复字符的最长子串的最大长度。
4.从head开始遍历字符串,如果字符第一次出现,则记录字符出现的位置。
5.如果字符已经出现过,计算无重复字符的最长子串的长度并与最大值比较,保留较大的值。head移动到字符上一次出现位置的后一位,i的值变为head-1,以便再次从head开始遍历字符串。
6.遍历结束,计算最后一次的无重复字符的子串的长度,并与最大值比较,保留较大值。
7.返回最大值。
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() <= 1) return s.length();
int[] flag = new int[128];
for(int j = 0; j < 128; j++) flag[j] = -1;
int head = 0, end = 0;
int max = 0;
for(int i = 0; i < s.length(); i++){
end = i;
if(flag[s.charAt(i)] != -1) {
if(end - head > max) max = end - head;
head = flag[s.charAt(i)] + 1;
i = head - 1;
for(int j = 0; j < 128; j++) flag[j] = -1;
}else{
flag[s.charAt(i)] = i;
}
}
if(end - head + 1 > max) max = end - head + 1;
return max;
}
}