LCR 167. 招式拆解 I - 力扣(LeetCode)
思想
思路来源:K神的三种解法
暴力解法
时间复杂度 O(n^3)
如果我们只是单纯的遍历一下字符串,之前没出现过的加到set里面,那么set里最后只会存一段字符串:
i表示子串的起始位置,j表示子串的结束位置。
但是我们要求的是最长子字符串。
所以我们还需要两个循环,i从0位置开始,j从i位置开始。
外层循环一次,内层循环n次。因此j每次都会遍历到尾部。这样就会形成一个区间段。
k会遍历[i,j]之间的每一个字符,判断该字符是否在上一段[i,j]之间是否出现过:
滑动窗口+哈希
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;
}
};