力扣第三题:【无重复字符的最长子串】
1.题目描述2.题目解析1.首先找到核心点:不重复的子串,那这个子串就需用一个容器来存储,以便于记录长度和判断后续字符是否与之重复。我想到了map映射,(或者说哈希表),查找方便。所以我创建一个hashmap,然后遍历字符串,不重复则存储,重复则更新辅助值以便判断长度。问题好像很简单,但是我总是对不同情况的讨论分析得不透彻:我试图采用if语句分类讨论所有情况;我试图在遇到重复字符时将重复字符之前的
·
1.题目描述
2.题目解析
1.首先找到核心点:不重复的子串,那这个子串就需用一个容器来存储,以便于记录长度和判断后续字符是否与之重复。我想到了map映射,(或者说哈希表),查找方便。所以我创建一个hashmap,然后遍历字符串,不重复则存储,重复则更新辅助值以便判断长度。
问题好像很简单,但是我总是对不同情况的讨论分析得不透彻:
- 我试图采用if语句分类讨论所有情况;
- 我试图在遇到重复字符时将重复字符之前的所有字符删除而非记录开始字符的位置;
- 我难以疏通在遇到重复字符时开始位置与长度的计算方式。
2.优秀题解:
它采用滑动窗口法,用队列存储符合要求的子串,不符合要求则滑动窗口。时间复杂度:O(n)。
如果遇到重复字符,则判断初始位置是否需要改变:
若重复元素+1后小于初始位置则不改变,否则重复元素+1为初始元素;
HashMap在put入相同Key时,后put的元素覆盖前put的
直接将遇到的字符put入map,然后计算长度:
取已记录的和当前位置-初始位置+1中的最大值。
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-left+1);
}
return max;
}
}
作者:powcai
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更多推荐
已为社区贡献1条内容
所有评论(0)