Java实现:给定一个字符串s找出不含重复字符的最长子串的长度
可以使用滑动窗口的方法来解决这个问题。
我们维护一个窗口,窗口中包含的字符都是不重复的。我们使用两个指针left和right来表示窗口的左右边界。初始时,left和right都指向字符串的第一个字符。
然后,我们依次将right向右移动,如果移动后的字符不在窗口中,那么就将其加入窗口,并更新窗口的最大长度;如果移动后的字符已经在窗口中,那么就需要将left向右移动,直到窗口中不包含重复字符为止。
具体实现如下:
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int left = 0, right = 0;
int maxLength = 0;
Set<Character> set = new HashSet<>();
while (right < n) {
char c = s.charAt(right);
if (!set.contains(c)) {
set.add(c);
maxLength = Math.max(maxLength, right - left + 1);
right++;
} else {
set.remove(s.charAt(left));
left++;
}
}
return maxLength;
}
}
时间复杂度:O(n),其中n是字符串的长度。遍历一次字符串即可。
空间复杂度:O(min(n, m)),其中n是字符串的长度,m是字符集的大小。最坏情况下,字符集的大小等于字符串的长度,此时窗口中的字符都是不重复的,需要使用O(n)的额外空间。但是如果字符集的大小固定,比如只包含英文字母,那么空间复杂度是O(1)
原文地址: https://www.cveoy.top/t/topic/iFH0 著作权归作者所有。请勿转载和采集!