美文网首页
LeetCode 3

LeetCode 3

作者: Junr_0926 | 来源:发表于2018-10-07 21:40 被阅读0次

    3. Longest Substring Without Repeating Characters

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

    输入:bbbbb
    输出:1

    输入:pwwkew
    输出:3

    思路

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

    #include <iostream>
    #include <vector>
    #include <string>
    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<string> 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 <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            vector<int> 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<string> 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

          本文链接:https://www.haomeiwen.com/subject/zckraftx.html