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

Posted 皇家大鹏鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表示字符串开始的位置,

 

以上是关于LeetCode 3. Longest Substring Without Repeating Characters(medium难度)精的主要内容,如果未能解决你的问题,请参考以下文章

leetcode1027. Longest Arithmetic Sequence

673. Number of Longest Increasing Subsequence

Leetcode 3. Longest Substring Without Repeating Characters

LeetCode 3. Longest Substring Without Repeating

3. 没有重复字母的最长子串 [leetcode 3: Longest Substring Without Repeating Characters]

3. 没有重复字母的最长子串 [leetcode 3: Longest Substring Without Repeating Characters]