您的位置:首页 > 其它

无重复字符的最长子串

2018-02-24 23:51 253 查看
题目:

给定一个字符串,找出不含有重复字符的 最长子串 的长度。

示例:

给定 “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<s.length())
{
//遍历[i , j)的区间找有相同字符的位置
for(k=i;k<j && s[k]-s[j];k++);
//如果有相同的值,咯动i
if(k!=j)
i=k+1;
//判断是否比max大
max=max > j-i+1?max:j-i+1;
++j;
}

return max;
}
};


②
(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: