无重复字符的最长子串
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 )的区间(不重复元素)里
给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 “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; } }
相关文章推荐
- 最长无重复字符的子串-LintCode
- 字符串最长不含重复字符的子串长度
- 最长无重复字符的子串
- 求字符串的最长无重复字符子串(C++)
- 字符串12:最长无重复字符子串练习题
- LeetCode OJ:Longest Substring Without Repeating Characters(最长无重复字符子串)
- lintcode-384-最长无重复字符的子串
- 3.无重复字符的最长子串(Longest Substring Without Repeating Characters)
- lintcode: 最长无重复字符的子串
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 最长无重复字符子串练习题
- 字符串中最长无重复字符的子串
- [leetcode]无重复字符的最长子串
- 在英文字符串中找第一个最长不含重复字符的子串高效实现(修改版)
- LintCode-最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 找出一个字符串中出现的重复的最长的字符子串
- 求字符串内不包含重复字符的最长子串
- 求字符串中最长无重复字符的子串
- Leetcode 刷题(python)之 无重复字符的最长子串