leetcode第三题
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “”
输出: 0
思路:利用HashMap来存储字符串中的每个字符(键)和其对应的索引(值),由于键是唯一的,使用put()方法会更新该字符的索引。利用滑动窗口的思想,假设有两个指针,右指针对字符串进行遍历,每当检测到有相同的字符时,让左指针移动到该字符之前索引(值)的后一位,这样保证了两个指针之间的字符串中没有相同的字符。每次左指针移动或右指针遍历完成,更新当前最大的长度值。
class Solution {
public static int lengthOfLongestSubstring(String s) {
//字符串为空时,直接返回0
if(s.length() == 0)
return 0;
Map<Character,Integer> map = new HashMap<>();
//模拟左指针
int left = 0;
int len = 0;
//模拟右指针
int right = 0;
for (;right <s.length();right++) {
char ch = s.charAt(right);
if(map.containsKey(ch)){
//更新当前最大的长度值
len = Math.max(len,right-left);
//取较大值,否则可能出现左指针后退的情况
left = Math.max(left,map.get(ch)+1);
}
//put方法会直接更新每个字符(键)的最新索引(值),键是唯一的
map.put(ch,right);
}
//遍历完成后更新最大长度值
return len>right-left?len:right-left;
}
}
时间复杂度:O(n)
本文介绍了LeetCode第三题的解决方案,即寻找字符串中不包含重复字符的最长子串的长度。通过使用HashMap记录字符及其索引,并结合滑动窗口思想,动态更新最大子串长度。时间复杂度为O(n)。
666

被折叠的 条评论
为什么被折叠?



