LeetCode Longest Substring Without Repeating Characters

Problem

My Answer in C++

A.O(n^2) => TLE

class Solution {
public:
    int lengthOfLongestSubstring(string s)
};

int hashmap[505];

bool hashmapjudge(string s, int l, int r) { // using hashmap judge whether the string has repeat character or not
    bool ans = true;
    
    memset(hashmap, 0, sizeof(hashmap));
    
    for (int i = l; i <= r; i++) {
        int index = int(s[i]);
        
        if (hashmap[index] == 1) {
            ans = false; break;
        }
        else hashmap[index] = 1;
    }
    
    return ans;
}

int Solution::lengthOfLongestSubstring(string s) {
    int ans = 0;
    
    if (s.length() == 1) return 1;
    
    for (int i = 0; i < s.length(); i++) {
        for (int j = 0; j < s.length(); j++) {
            if (hashmapjudge(s, i, j)) {
                if (j-i+1 > ans) ans = j-i+1;
            }
        }
    }
    
    return ans;
}

B.O(n) => Accept

class Solution {
public:
    int lengthOfLongestSubstring(string s)
};

int hashmap[505]; // using hashmap record the character's pla

int Solution::lengthOfLongestSubstring(string s) {
    int ans = 0, start = 0;
    
    memset(hashmap, -1, sizeof(hashmap));
    
    if (s.length() == 0) return 0;
    if (s.length() == 1) return 1;
    
    for (int i = 0; i < s.length(); i++) {
        int index = int(s[i]);
        
        // refresh start
        if (hashmap[index] != -1 && hashmap[index]+1 > start)
            start = hashmap[index]+1;    
        
        if (i-start > ans) ans = i-start;
        
        // refresh character's pla in hashmap(using ASCII index)
        hashmap[index] = i;
    }
    
    return ans+1;
}

Details

Better Solutions

Better Solutions

Feelings and Review

总的来说,本题难度一般(废话)。

1.首先要做的是理解题意,题目求所有满足要求的特殊字符串中最长字符串的长度,这个字符串里面的字符都是不重复的。

2.本题实现起来较为容易,但是需要冷静,暴力解决不了问题,O(n^2)的算法(即上文中的A解法)不能过最后一个样例(非常长),因此需要考虑算法的优化。

3.我所考虑的一种算法是,遍历一遍字符串,一个是根据由散列(index是字符的ASCII码)将字符串中的每一个字符出现的位置记录下来并不断更新;另一个是维护特殊字符串的首指针(start):当出现重复的字符时,将首指针移动到这个重复字符上一次出现位置的下一位(比如重复字符'a'上一次出现的位置是3,start就移动到4),但是前提是首指针不能倒退!(考虑样例:abssba)。

最后,在这个遍历的过程中,不断判断和更新answer即可。时间复杂度O(n)。

2017/2/3

原文地址:https://www.cnblogs.com/qq952693358/p/6363240.html