LeetCode Longest Substring Without Repeating Characters
2015-08-08 10:30
399 查看
原题链接在这里:https://leetcode.com/problems/longest-substring-without-repeating-characters/
题目:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
题解:
String 题目,基本思路就是维护一个窗口[walker,runner]. walker,runner都是向右移,同时维护一个HashSet hs,用来存储这一段中的所有不同character。首先右侧窗口runner在前跑,每当遇到hs中没有的character,加入hs,知道遇到相同元素,说明以不符合要求,runner停下,准备移动左侧窗口walker。
移动左侧窗口walker前,先更新最大长度max(res, runner - walker)。然后开始移动walker,一直找到与此时runner指向的相同元素,之前的元素都需从hs中删除。
本应删掉此时walker指向的元素,但由于runner还要再次添加这个元素,并且那一行在else statement 里不方便改写,所以没有删掉walker此时指向的元素。
Note:无论hs中是否含有runner指向的元素,runner都要向后移,否则下一循环时就会错误减掉元素。
Time Complexity: O(n). runner只跑一遍string, n是string长度. Space Complexity: O(n). 用了HashSet.
AC Java:
跟上一道Longest Substring with At Most Two Distinct Characters
题目:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
题解:
String 题目,基本思路就是维护一个窗口[walker,runner]. walker,runner都是向右移,同时维护一个HashSet hs,用来存储这一段中的所有不同character。首先右侧窗口runner在前跑,每当遇到hs中没有的character,加入hs,知道遇到相同元素,说明以不符合要求,runner停下,准备移动左侧窗口walker。
移动左侧窗口walker前,先更新最大长度max(res, runner - walker)。然后开始移动walker,一直找到与此时runner指向的相同元素,之前的元素都需从hs中删除。
本应删掉此时walker指向的元素,但由于runner还要再次添加这个元素,并且那一行在else statement 里不方便改写,所以没有删掉walker此时指向的元素。
Note:无论hs中是否含有runner指向的元素,runner都要向后移,否则下一循环时就会错误减掉元素。
Time Complexity: O(n). runner只跑一遍string, n是string长度. Space Complexity: O(n). 用了HashSet.
AC Java:
public class Solution { public int lengthOfLongestSubstring(String s) { if(s == null || s.length() == 0){ return 0; } int res = 0; HashSet<Character> hs = new HashSet<Character>(); int walker = 0; int runner = 0; while(runner < s.length()){ if(!hs.contains(s.charAt(runner))){ hs.add(s.charAt(runner)); runner++; }else{ while(s.charAt(walker) != s.charAt(runner)){ hs.remove(s.charAt(walker)); walker++; } walker++; runner++; } res = Math.max(res, runner-walker); } return res; } }
跟上一道Longest Substring with At Most Two Distinct Characters
相关文章推荐
- ps使用方法续
- POJ 1274The Perfect Stall
- Hdu1166 树状数组
- 南邮 OJ 2045 罗马PK
- autolayout - sizeClass 学习 ~ two
- java基础语法1
- ubuntu安装mysql
- Kafka 与 Flume 对比
- [算法专题] 深度优先搜索&回溯剪枝
- Java基础-IO-File(笔记)
- 南邮 OJ 2044 没有被接待的童鞋
- 数学之美番外篇:平凡而又神奇的贝叶斯方法
- hdu1166
- maven依赖范围
- hdu5360 Hiking
- Minimum Size Subarray Sum -- leetcode
- form表单
- [算法专题] 深度优先搜索&回溯剪枝
- Trie树讲解
- 南邮 OJ 2043 有才华的罗老师