您的位置:首页 > 其它

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:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: