无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例1
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例2
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
思路:采用滑动窗口的思想,滑动窗口中的字符都是连续不重复的,使用left代表左边界、right代表右边界
遍历字符串中的每个字符,将字符以及字符的索引存到Map中,这样Map中保存的字符都是它们最后的索引,当遍历的元素在Map中已存在证明重复了那么将left左边界移到该元素的后面,每次遍历right都往前移直到等于数组的最大索引,每次遍历计算一下滑动窗口的大小并和result中存储的大小进行比较,如果比result大那么赋值给result,这样result就保存的是最大窗口大小也就是不含重复字符的字串的最大长度。
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character,Integer> map=new HashMap<Character,Integer>();
char[] chars=s.toCharArray();
int left=0;
int right=0;
int result=0;
for (int i = 0; i < chars.length; i++) {
int tmp;
char c=chars[i];
if (map.containsKey(c)&&(map.get(c)>=left))
{
Integer index=map.get(c);
left=index+1;
}
map.put(c,i);
tmp=right-left+1;
if(right<chars.length-1)
{
right++;
}
if (tmp>result)
{
result=tmp;
}
}
return result;
}
}
时间复杂度为O(n)