Java给定一个字符串s找出不含有重复字符的最长子串的长度不使用HashMap
可以使用滑动窗口的方法来解决这个问题。
算法步骤如下:
- 定义两个指针,left和right,分别表示子串的起始位置和结束位置。
- 初始化最长子串的长度maxLen为0。
- 遍历字符串s,将right指针从0开始向右移动,同时将遇到的字符添加到一个集合中。
- 如果遇到的字符在集合中已经存在,表示出现了重复字符,此时需要移动left指针,直到集合中不包含重复字符。
- 在每次移动left指针的过程中,更新maxLen的值为当前子串的长度和maxLen中的较大值。
- 重复步骤3-5,直到right指针遍历完整个字符串s。
- 返回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)
原文地址: https://www.cveoy.top/t/topic/iFIG 著作权归作者所有。请勿转载和采集!