LeetCode 3

3. Longest Substring Without Repeating Characters

给定一个字符串,计算它的最长的没有重复字符的子串的长度。
例子:
输入:abcabcbb
输出:3

输入:bbbbb
输出:1

输入:pwwkew
输出:3

思路

遍历一遍字符串,记录子串的开始位置和结束位置。开始时两个位置都在第一个字符处。接着不断增加子串长度直到结束或者遇到重复字符,如果遇到重复字符,将重复的字符开始出现的位置,作为新的子串的开始位置,然后继续增加子串的长度。

#include 
#include 
#include 
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int* record = new int[128] ();
        int max_length = 0;
        int start = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (record[s[i]] > start) // 曾经出现过,并且出现位置大于子串开始位置
                start = record[s[i]];
            record[s[i]] = i; // 记录下每个字符出现的位置
            max_length = max(max_length, i - start);
        }
        return max_length;
    }
};

int main() {
    Solution solver;
    vector text;
    text.push_back("abcabcbb");
    text.push_back("bbbbb");
    text.push_back("pwwkew");
    for (int i = 0; i < 3; ++i) {
        cout << solver.lengthOfLongestSubstring(text[i]) << std::endl;
    }
}

提交了答案后发现错误:


wrong

这应该是因为没有考虑到只有一个字符的情况,以及如果全部初始化为0其实表示第一个元素,等于跳过了第一个元素。
改为下面:

#include 
#include 
#include 
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector record(128, -1);
        int max_length = 0;
        int start = -1;
        for (int i = 0; i < s.length(); ++i) {
            if (record[s[i]] > start) // 曾经出现过,并且出现位置大于子串开始位置
                start = record[s[i]];
            record[s[i]] = i; // 记录下每个字符出现的位置
            max_length = max(max_length, i - start);
        }
        return max_length;
    }
};

int main() {
    Solution solver;
    vector text;
    text.push_back("abcabcbb");
    text.push_back("bbbbb");
    text.push_back("pwwkew");
    text.push_back(" ");
    for (int i = 0; i < 4; ++i) {
        cout << solver.lengthOfLongestSubstring(text[i]) << std::endl;
    }
}

结果:


Screen Shot 2018-10-07 at 9.28.31 PM.png

这样就和https://leetcode.com/problems/longest-substring-without-repeating-characters/discuss/1737/C++-code-in-9-lines 一样了。

你可能感兴趣的:(LeetCode 3)