LeetCode T3 无重复字符的最长字串
简单的字符串,学习滑动窗口的思想。
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
滑动窗口
最初的想法是对每个字母s[i],遍历s[i]到s[n],记录最短的子串。
但是可以优化的点在于,可以省去一些重复的检查。
比如 s = “abcdeab”
当检测出abcde不重复,遇到a停止检测,对b进行检测,bcde是不需要重复检测的。因此把它想象成一个可以滑动的窗口就可以减少开销。
然后想到,用hashmap存储窗口里的值,这样每次检查containskey的时候开销是O(1)。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] ch = s.toCharArray();
HashMap<Character, Integer> hashmap = new HashMap<>();
int head=0,tail=0,max=0;
while(head<s.length() && tail < s.length())
{
if (!hashmap.containsKey(ch[tail]))
{
hashmap.put(ch[tail],tail);
tail++;
if (tail-head > max)
max=tail-head;
}
else {
hashmap.remove(ch[head]);
head++;
}
}
return max;
}
}
优化
发现自己不能只追求做出来了……执行时间超过76% 内存竟然只超过5%
2333
所以不需要新建一个charArray来存。
java String中的charAT() 方法就可以取出来某个索引位置的值。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!