某套连招动作记作序列 arr,其中 arr[i] 为第 i 个招式的名字。请返回 arr 中最多可以出连续不重复的多少个招式。

示例 1:

**输入:**arr = “dbascDdad”
**输出:**6
**解释:**因为连续且最长的招式序列是 “dbascD” 或 “bascDd”,所以其长度为 6。

示例 2:

**输入:**arr = “KKK”
**输出:**1
**解释:**因为无重复字符的最长子串是 “K”,所以其长度为 1。

示例 3:

**输入:**arr = “pwwkew”
**输出:**3
**解释:**因为连续且最长的招式序列是 “wke”,所以其长度为 3。
请注意区分 子串 与 子序列 的概念:你的答案必须是 连续招式 的长度,也就是 子串。而 “pwke” 是一个非连续的 子序列,不是 子串。

提示:

0 <= arr.length <= 40000

arr 由英文字母、数字、符号和空格组成。

可以通过滑动窗口来计算以当前字符结尾的最长不重复子串

使用哈希表来保存当前字符最后一次出现的下标

关键是更新左边界时要取 max(l, flag[curChar]),因为之前已经因为其他元素重复,不能再扩大左边界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int dismantlingAction(string arr) {
if (arr.size() <= 1)
return arr.size();
unordered_map<char, int> flag;
int l = 0, r = 1;
int ans = 1;
flag[arr[0]] = 1; // 这里我保存的是最后一次出现的下标+1
for (r = 1; r < arr.size(); r++) {
char mid = arr[r];
if (flag[mid] != 0) { // 如果使用.find()!=.end()可以考虑直接保存下标
l = max(l, flag[mid]);
}
flag[mid] = r + 1;
ans = max(ans, r - l + 1);
}
return ans;
}
};