给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
解题思路:
这道题wa了挺久的挺尴尬的,考虑的场景不全,总是有漏子。
随便说一下思路吧,解题思路可以是双重遍历然后加map做判定存储,每次遍历clear一下 这样做也行,但是就是挺耗费性能的。
然后如果要在O(n)时间内完成,就要想一下啦。其实是不是可以这么想:
(1)对于遇到重复的字符串进行下判定,输出此时的子串的长度。
(2)但是还是得循环体内每次判定下,不然abcd等没有重复节点会有问题呢。
(3)这样做还是有问题呀,需要考虑下遇到abcdba这种情况。所以有了以下代码
class Solution {
public int lengthOfLongestSubstring(String s)
{
int maxNum=0;
int indexStart=0;
int length =s.length();
Map<Character,Integer> map = new HashMap<>();
for(int i=0;i<length;++i)
{
char c =s.charAt(i);
if(map.containsKey(c)&&map.get(c)>=indexStart)
{
indexStart =map.get(c)+1;
}
map.put(c, i);
maxNum=Math.max(maxNum, i-indexStart+1);
}
return maxNum;
}
}