• LeetCode 3. Longest Substring Without Repeating Characters(medium难度)【精】


    Given a string, find the length of the longest substring without repeating characters.

    Examples:

    Given "abcabcbb", the answer is "abc", which the length is 3.

    Given "bbbbb", the answer is "b", with the length of 1.

    Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

     题目很通俗易懂,就是找一个字符串中,没有重复字符的最长子串的长度。说实话,这道中等难度的题目卡了我很久,最后把它想明白时,内心还是有些小小的激动的。其实不仅是刷题,人生中很多其他方面的事情也都需要有一个积极的心态,不断给自己积极的心理暗示,这样结果一般真的就能如你所愿。

    回归正题,这道题暴力搜索法复杂度是O(n^3),这也很好理解,两个指针分别指向字符串的首尾,两重循环,每次都需要判断两个指针之间是否有重复的字符,我们在面试时可以第一时间向面试官讲出这样的思路,至少可以从侧面展现出我们思维敏捷的特点,后续的改进再聊。刷题时,这个复杂度肯定会超时,我们需要进一步改进它。我这里直接把最优解的代码贴出来,时间复杂度为O(n)之后我再解释为何这样做,代码如下:

     1 class Solution {
     2 public:
     3     int lengthOfLongestSubstring(string s) {
     4         //这道题目还是很不错的,参考着优秀解答写一般,O(n)复杂度,以空间换时间。
     5         vector<int> mymap(256,-1);
     6         int i,last=0,ans=0;
     7         for (int i = 0; i < s.length(); i++)
     8         {
     9             if (mymap[s[i]] == -1 || mymap[s[i]] < last)  //如果该字符没有出现过
    10                 ans = max(ans, i - last + 1);
    11             else
    12                 last = mymap[s[i]] + 1;
    13             mymap[s[i]] = i;
    14         }
    15         return ans;
    16      
    17     }
    18 };

    解释一下思路:last表示字符串开始的位置,也就是统计长度开始的位置,ans表示最后统计的长度,for循环是遍历整个字符串,我们只遍历一次,所以最后时间复杂度是O(n)。其实应该使用一个hash map来记录字符和字符在字符串中的序号这组映射,但是这里用vector一样方便,二而且是从char到int的隐式转换,不存在精度损失的问题。     我们注意到,if之后的两个条件是“或”的关系,第一个条件是“该字符没有在字符串中出现过”,第二个是“该字符出现过,但是出现的顺序在last之前(此时也应该算进新的子串)”,这两种情况都需要重新统计满足要求的字串长度,因为可能会得到更长的子串。除了刚才两种情况,我们需要更新一下last

  • 相关阅读:
    人人学IoT 助学思维导图
    基于netty4.x开发时间服务器
    JAVA实现的截屏程序
    java获取硬盘ID以及MAC地址
    神经网络joone_engin模式识别示范,eclipse
    神经网络/人工智能 开源库
    双目测距
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    一个java 开源神经网络引擎 joone
    用Java开源项目JOONE实现人工智能编程
  • 原文地址:https://www.cnblogs.com/dapeng-bupt/p/8000381.html
Copyright © 2020-2023  润新知