【算法】【字符串】无重复字符的最长子串

1  题目

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

2  解答

绞尽脑汁,咋我老绕自己呢,下边这个能通过,我明天抽空再想想,看看还有什么思路还有哪些能优化的:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0;
        // 参数边界校验
        if (s == null || s.length() == 0) {
            return res;
        }

        // 当发现重复的就记录当前最长的
        int currentStart = 0;
        String maxStr = "";
        String currentStr = "";
        for (int i = 1; i < s.length(); i++) {
            String subChar = s.charAt(i) + "";
            currentStr = s.substring(currentStart, i + 1);
            // 前面的串不包含当前字符,那就继续向后
            int index = currentStr.indexOf(subChar);
            if (index == currentStr.length() - 1) {
                continue;
            }
            // 包含当前的字符了
            if (currentStr.length() - 1 >= maxStr.length()) {
                maxStr = s.substring(currentStart, i);
            }
            currentStart += (index + 1);
            currentStr = "";
        }
        if (maxStr.length() == 0) {
            return s.length();
        }
        return Math.max(maxStr.length(), currentStr.length());
    }
}

来了,来了,一次遍历清晰的逻辑:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        if (s == null || s.length() <= 0) {
            return max;
        }
        StringBuilder subStr = new StringBuilder(s.charAt(0) + "");
        for (int i = 1; i < s.length(); i++) {
            String current = s.charAt(i) + "";
            int index = subStr.indexOf(current);
            // 如果不包含,则继续
            if (index < 0) {
                subStr.append(current);
                continue;
            }
            // 遇到重复的了 算是一种结果
            max = Math.max(max, subStr.length());
            // 删掉那个重复的
            subStr = new StringBuilder(subStr.substring(index + 1));
            subStr.append(current);
        }
        max = Math.max(max, subStr.length());
        return max;
    }
}

加油。

posted @ 2024-02-26 22:54  酷酷-  阅读(16)  评论(0编辑  收藏  举报