可以使用哈希表来解决这个问题。

算法步骤如下:

  1. 初始化一个哈希表,用于记录每个字符最后出现的位置。
  2. 初始化两个变量:maxLen表示最长子串的长度,start表示最长子串的起始位置。
  3. 遍历字符串s,对于每个字符c:
    • 如果哈希表中已经存在字符c,更新start为字符c的下一个位置。
    • 计算当前子串的长度,即i - start + 1,并更新maxLen。
    • 将字符c的位置更新为i。
  4. 返回maxLen。

以下是Java代码实现:

import java.util.HashMap;

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        
        HashMap<Character, Integer> map = new HashMap<>();
        int maxLen = 0;
        int start = 0;
        
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            if (map.containsKey(c)) {
                start = Math.max(start, map.get(c) + 1);
            }
            
            int len = i - start + 1;
            maxLen = Math.max(maxLen, len);
            
            map.put(c, i);
        }
        
        return maxLen;
    }
}

时间复杂度:O(n),其中n是字符串s的长度。遍历一次字符串s,每个字符都需要O(1)的时间来更新哈希表和计算子串长度。

空间复杂度:O(m),其中m是字符集的大小。哈希表最多存储m个字符的位置

Java给定一个字符串s找出不含有重复字符的最长子串的长度不使用滑动窗口的方法

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

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