给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "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; } }