zoukankan      html  css  js  c++  java
  • LeetCode 03 最长不重复字串

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    int lengthOfLongestSubstring(string s) 
    {
    	int res = 0, left = 0, n = s.size();
    	unordered_map<int, int> m;
    	for (int i = 0; i < n; ++i) {
    		if (m.count(s[i])) {
    			left = m[s[i]];
    		}
    		m[s[i]] = i;
    		res = max(res, i - left);
    	}
    	return res;
    }
    

      

      解题思路:

    使用滑动窗口法, i为右边界, left为左边界的前一个

    使用i-left就可以求出长度. 如果字符串为空, i=0, 那么长度就是1; 这也是为什么把left设为-1的原因;

    使用hashmap 保存每个数和其下标的映射,

    如果s[i]已经出现过了, 那么map[s[i]]就大于零

    那么此时有两种情况:

    1. 上次出现的位置在left的左边, 既不在left和i的区间内

      这种情况下, 需要将当前字符包含在区间内, 然后更新下坐标,进行下次循环

    2. 上次出现的位置在left的右边, 即在区间内

      此时将left 指针直接移到上次出现该字符的位置, 才能满足不重复的要求.

    最后, 每次判断一个字符, 就更新下 i-left和当前最长长度.

      

  • 相关阅读:
    高斯金字塔、拉普拉斯金字塔
    边缘检测:Canny算子,Sobel算子,Laplace算子
    数据结构-排序
    数据结构-查找
    数据结构-图
    数据结构-树
    数据结构-串
    数据结构-栈和队列
    数据结构-链表
    数据结构-线性表存储
  • 原文地址:https://www.cnblogs.com/derek-dhw/p/10478289.html
Copyright © 2011-2022 走看看