题目:
给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,“pwke” 是 子序列 而不是子串。
解题方法:
①基于顺序遍历,时间复杂度O(n^2),空间复杂度O(1),过程:
开始设置i(用来记录最大子串的起始序号),j(用来记录最大子串的结束序号)
k遍历[i , j)的区间的所有值,若s[j]等于其一个值,改变i的位置到k++
判断当前区间长度j-i+1是不是比最大的长度大
j++
> ②由不含有重复字符:联系到hash,优化k遍历[i , j)的区间的所有值这个过程。 > 通过hash可以在O(1)时间复杂度找到是否存在该元素 > hashmap存: > key value > 值 序号 如:3 0 2 1 如果:有重复元素,只需移动i到重复元素(原来的)后一个元素 判断是否重复:1.包含当前元素的key 2.包含的元素的序号要在[i , j )的区间(不重复元素)里 ``` ① class Solution { public: int lengthOfLongestSubstring(string s) { if(s.length()==0) return 0; int max=1,i=0,j=1,k; while(j
};
②
(java)
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0)
return 0;
int max=1,i=0,j=1;
HashMap<Character,Integer>map = new HashMap();
map.put(s.charAt(0),0);
while(j<s.length())
{
//找有相同字符的位置,有的话需要进行判断,序号是否位于[i,j}
if(map.containsKey(s.charAt(j))==true && map.get(s.charAt(j))>=i)
i=map.get(s.charAt(j))+1;
//用进行覆盖,没有进行添加
map.put(s.charAt(j),j);
//判断是否比max大
if(j-i+1>max)
max=j-i+1;
++j;
}
return max;
}
}