剑指offer 面试题48 .最长不含重复字符的子字符长度

100 阅读1分钟

LCR 167. 招式拆解 I - 力扣(LeetCode)

思想

思路来源:K神的三种解法

暴力解法

时间复杂度 O(n^3) image.png 如果我们只是单纯的遍历一下字符串,之前没出现过的加到set里面,那么set里最后只会存一段字符串: i表示子串的起始位置,j表示子串的结束位置。

image.png

但是我们要求的是最长子字符串。

所以我们还需要两个循环,i从0位置开始,j从i位置开始。

外层循环一次,内层循环n次。因此j每次都会遍历到尾部。这样就会形成一个区间段。

k会遍历[i,j]之间的每一个字符,判断该字符是否在上一段[i,j]之间是否出现过:

image.png

image.png

滑动窗口+哈希

class Solution {
public:
    int dismantlingAction(string arr) {
        unordered_map<char, int> dic;
        int i = -1, res = 0, len = arr.size();
        for(int j = 0; j < len; j++) {
            if (dic.find(arr[j]) != dic.end())
                i = max(i, dic.find(arr[j])->second); //让i出现在j位置的字符上一次出现的位置
            dic[arr[j]] = j; //更新j位置的字符在哈希表中的下标,保证哈希表里存的是字符最后一次出现位置的下标
            res = max(res, j - i); //每次更新res,保证res是最长的无重复段
        }
        return res;
    }
};

image.png