题目描述:(力扣题库3)
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 :
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
思路分析:
首先,我想到的是暴力枚举法,但暴力枚举法在这个问题上的时间复杂度较高,因为它需要检查所有可能的子串,然后对每个子串检查是否有重复字符。这会导致时间复杂度为 O(n^3),其中 n 是输入字符串的长度。因此,暴力枚举法不太适合解决这个问题,而使用哈希表来存储字符出现的位置能够在 O(n) 的时间复杂度内解决该问题。
解题方法: 滑动窗口法
解题思路:
- 使用一个哈希表
hashTable
来存储字符和它们在字符串中的索引位置。
Map<Character, Integer> hashTable = new HashMap<>();
- 使用
length
变量来跟踪当前不重复子串的长度,max_length
变量来存储找到的最长不重复子串的长度,index
变量来记录当前不重复子串的起始位置。
int length = 0;
int max_length = 0;
int index = 0;
- 遍历输入字符串
s
,对于每个字符:- 如果字符不在
hashTable
中,将字符添加到hashTable
中,并增加length
。
- 如果字符不在
for (int i = 0; i < s.length(); i++) {
if (!hashTable.containsKey(s.charAt(i))) {
length++;
hashTable.put(s.charAt(i), i);
}
-
- 如果字符已经在
hashTable
中,表示出现重复字符,需要更新max_length
,更新index
为当前重复字符的索引位置,然后重新计算length
为当前位置减去index
。
- 如果字符已经在
- 在循环结束后,比较
length
和max_length
,取较大值作为最终结果。
max_length = Math.max(length, max_length);
return max_length;
这段代码的时间复杂度为 O(n),其中 n 为输入字符串的长度。
以下是完整的方法:
class Solution {
public static int lengthOfLongestSubstring(String s) {
Map<Character, Integer> hashTable = new HashMap<>();
int length = 0;
int max_length = 0;
int index = 0;
for (int i = 0; i < s.length(); i++) {
if (!hashTable.containsKey(s.charAt(i))) {
length++;
hashTable.put(s.charAt(i), i);
} else {
if (max_length < length)
max_length = length;
index = Math.max(index, hashTable.get(s.charAt(i)));
length = i - index;
hashTable.put(s.charAt(i), i);
}
}
max_length = Math.max(length, max_length);
return max_length;
}
}
以上是本篇文章的全部内容,感想观看.