3. 无重复字符的最长子串

中等

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

提示:

  • 0 <= s.length <= 5 * 104

  • s 由英文字母、数字、符号和空格组成

public class T4 {
    public int lengthOfLongestSubstring(String s) {
        if(s.length() == 0)
        {
            return 0;
        }
        int ans = 0;
        int max = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (sb.indexOf(s.charAt(i) + "") == -1) {
                sb.append(s.charAt(i));
                max++;
            } else {
                sb.append(s.charAt(i));
                sb.delete(0, sb.indexOf(s.charAt(i)+"")+1);
                if (max > ans)
                    ans = max;
                max = sb.length();
            }
            if (i == s.length() - 1 && max > ans) {
                ans = max;
            }
        }

        return ans;
    }
    public static void main(String[] args) {
        System.out.println(new T4().lengthOfLongestSubstring("pwwkew"));
    }
}

代码解答过程解释

  1. 初始化变量

    • 初始化 ansmax 为 0,用于记录最长子串的长度。

    • 创建一个 StringBuilder 对象 sb,用于存储当前遍历过的字符。

  2. 遍历字符串

    • 使用 for 循环遍历字符串 s 中的每个字符。

  3. 判断字符是否重复

    • 判断当前字符是否在 sb 中已经存在,如果不存在,则将该字符添加到 sb 中,并增加 max 的值。

    • 如果字符已经存在于 sb 中,说明出现了重复字符,此时需要更新 max 的值,并将 sb 中重复字符及其之前的字符删除,保留从重复字符之后的字符。

  4. 更新最长子串长度

    • 每次遇到重复字符时,都需要判断当前的 max 是否大于之前记录的 ans,如果是则更新 ans 的值为当前的 max

    • 在循环结束时,再次判断一次 max 是否大于 ans,如果是则更新 ans 的值为当前的 max

  5. 返回结果

    • 返回最终计算得到的 ans,即不含重复字符的最长子串的长度。

这段代码的主要思路是通过遍历字符串,使用 StringBuilder 来动态存储当前的子串,并实时更新最长子串的长度。当遇到重复字符时,通过删除重复字符及其之前的字符,保留从重复字符之后的字符,来实现寻找不含重复字符的最长子串。