LeetCode 3. Longest Substring Without Repeating Characters

来源:互联网 发布:网络吃鸡是什么意思啊 编辑:程序博客网 时间:2024/05/29 13:56

本题出处 来自LeetCode Algorithms中的一道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.

看完题目,可以知道本题要求我们做的事情可以概括为:找到字符串string中连续的, 不包含重复字符的最长子串的长度

OK,看完这道题目,开始解答。我们先试想如果这不是一道编程问题,我们会如何解决这道题。

首先看看”abcabcbb”这串字符串,我们会从第一次的起点——第一个字符’a’开始看起,然后接着是’b’、’c’。然后到了下一个’a’,我们此时发现,’a’已经重复出现过。

所以此时我们知道,目前最长的子串为”abc”,长度为3 。接下来,我们又该如何继续我们的计数呢?聪明的同学会想到,我们可以从第一个起点(第一个’a’)的下一个字符(第一个’b’)开始数起,重复我们刚才的方法。

但是,这样在一定条件下是会有所冗余的。此处我们看另外一个例子。”pwwkew”,我们发现,第一次出现重复会是在第二个’w’,那接下来我们如果从第一个起点(第一个’p’)的下一个字符(第一个’w’)开始重新数起,重复操作。我们会发现,马上又碰到了重复的’w’。这样的做法其实没有充分利用到我们已经发现’w’重复这个信息。

所以,有更聪明的同学想到了可以从第一个重复字符(’a’的下一个字符’b’开始数起),重复刚才的方法。

分析到了这里,已经把我们大致的思路都写出来了,那剩下就是coding了。

int lengthOfLongestSubstring(string s) {    vector pos(256, -1);    int length = 0;    int start = -1;    for (int i = 0; i < s.length(); ++i) {        if (pos[s[i]] > start)            start = pos[s[i]];        pos[s[i]] = i;        length = length > i-start ? length : i-start;    }    return length;}

复杂度分析:1.时间复杂度:O(n) 2.空间复杂度:O(1)

阅读全文
0 0