可以使用滑动窗口的方法来解决这个问题。

算法步骤如下:

  1. 定义两个指针,left和right,分别表示子串的起始位置和结束位置。
  2. 初始化最长子串的长度maxLen为0。
  3. 遍历字符串s,将right指针从0开始向右移动,同时将遇到的字符添加到一个集合中。
  4. 如果遇到的字符在集合中已经存在,表示出现了重复字符,此时需要移动left指针,直到集合中不包含重复字符。
  5. 在每次移动left指针的过程中,更新maxLen的值为当前子串的长度和maxLen中的较大值。
  6. 重复步骤3-5,直到right指针遍历完整个字符串s。
  7. 返回maxLen作为结果。

以下是Java代码实现:

public int lengthOfLongestSubstring(String s) {
    int n = s.length();
    int maxLen = 0;
    Set<Character> set = new HashSet<>();
    int left = 0, right = 0;
    while (right < n) {
        if (!set.contains(s.charAt(right))) {
            set.add(s.charAt(right));
            maxLen = Math.max(maxLen, right - left + 1);
            right++;
        } else {
            set.remove(s.charAt(left));
            left++;
        }
    }
    return maxLen;
}

时间复杂度:O(n),其中n是字符串s的长度。滑动窗口的过程中,left和right指针分别遍历了一次字符串s。

空间复杂度:O(min(n, m)),其中n是字符串s的长度,m是字符集的大小。在滑动窗口的过程中,使用了一个集合来存储不重复的字符。最坏情况下,字符集的大小为n,此时空间复杂度为O(n)

Java给定一个字符串s找出不含有重复字符的最长子串的长度不使用HashMap

原文地址: https://www.cveoy.top/t/topic/iFIG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录