力扣:3. 无重复字符的最长子串 题解(Java)

题目地址:无重复字符的最长子串

 

题目描述:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 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;
    }
}

 


版权声明:本文为HOOHV原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。