题目描述
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given
"abcabcbb"
, the answer is"abc"
, which the length is 3.Given
"bbbbb"
, the answer is"b"
, with the length of 1.Given
"pwwkew"
, the answer is"wke"
, with the length of 3. Note that the answer must be a substring,
"pwke"
is a subsequence and not a substring.
给出一个字符串,找出不含重复字母的最长连续子序列。
根据题意,我们可以采用HashMap+双指针,从前到后遍历字符串数组。HashMap中Key存的是遍历到的字符,value是其下标。双指针为i和j(其中i<j,j
是当前遍历的指针,i是最长不重复字串的开头)。初始结果max为0,每当j更新到一个位置时,都会判断hm中是否存在key = s[j],如果存在,那么比较i
的位置和该元素在数组s中的位置,如果i在该元素之前,将i移到该元素之的位置,否则不改变i,之后将元素s[j]及其下标存入hm中,然后比较当前字符串
的长度是否大于最大值max;是,则更新max。示例代码
public class Solution {
public int lengthOfLongestSubstring(String s) {
int count = 0;
HashMap<Character, Integer> hm = new HashMap<>();
for(int i=0, j=0; j < s.length(); j ++){
if(hm.containsKey(s.charAt(j))){
i = Math.max(i,hm.get(s.charAt(j))+1);
}
hm.put(s.charAt(j), j);
count = Math.max(count,j-i+1);
}
return count;
}
}
疑问
HashMap的查找的时间复杂度是O(1)吗,有时间要看HashMap的源码弄清底层实现原理。比如红黑树之类的