参考他的人代码:https://blog.csdn.net/littlebai07/article/details/79100081
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b"
,其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 无重复字符的最长子串是"wke"
,其长度为 3。 请注意,答案必须是一个子串,"pwke"
是一个子序列 而不是子串。
距离abcabcbb
思路:遍历字符串,从一个字符到最后一个字符。如果字符不存在,则加入Map中,temp长度增加。
i表示当前所在位置,i-temp表示map中字符串的初始位置。
如果该字符已经在map中存在,则分两种情况处理:1.当前遍历的字符的位置在i-temp的范围内,那么
将temp截断。也就是重新在i+1的位置开始遍历字符串的。比如abca,temp=当前位置(4)减去第一个a的位置(1),也就是从第二个a开始
遍历字符串。
2.如果当前遍历的字符串不在i-temp的范围内,temp++,同时立即更新该字符串在map中的位置,比如abdacbeg,从第二个a开始重新遍历,
遇到第二个b,由于第一个b的字符不在i-temp的范围内,因此temp+1,同时更新b的map。
字符串 | Map | temp |
---|---|---|
a—-bcabcbb | {a:0} | 1 |
ab—-cabcbb | {a:0,b:1} | 2 |
abc—-abcbb | {a:0,b:1,c:2} | 3 |
abca—-bcbb | {a:3,b:1,c:2} | 3 |
abcab—-cbb | {a:3,b:4,c:2} | 3 |
abcabc—-bb | {a:3,b:4,c:5} | 3 |
abcabcb—-b | {a:3,b:6,c:5} | 2 |
abcabcbb | {a:3,b:7,c:5} | 1 |
代码如下:
class Solution { public int lengthOfLongestSubstring(String s) { char [] c=s.toCharArray(); int len=s.length(); Map<Character,Integer> map=new HashMap(); int max=Integer.MIN_VALUE; int temp=0; for(int i=0;i<len;i++){ if(map.containsKey(c[i])){ if(map.get(c[i])+temp<i){ // 列举到第二个C的时候,此时temp截断,从c开始计算位置,i-temp表示起始位置 temp++; }else{ max=Math.max(temp,max); temp=i-map.get(c[i]); } map.put(c[i],i); }else { map.put(c[i],i); temp++; } } max=Math.max(max,temp); return max; } }
如果有不理解的地方,希望读者可以自己举例,或者通过Java中的Debug,可以清晰地了解字符串遍历的过程。