题解 | #牛牛的协作#
牛牛的协作
https://www.nowcoder.com/practice/ae483ed148b34e14bec1451b3317984d
考察的知识点:字符串、滑动窗口;
解答方法分析:
- 定义变量n,表示字符串s的长度;maxLength用来记录最长连续字符的长度;left表示窗口的左边界;
- 创建一个unordered_set集合taskSet,用于存储当前窗口内出现的字符;
- 进入循环,循环条件是right小于字符串s的长度;
- 在循环中,获取当前字符ch = s[right];
- 判断字符ch是否在taskSet中,如果不在,表示该字符是新出现的字符,需要将其加入taskSet,并更新maxLength;
- 如果字符ch已经在taskSet中,表示该字符在当前窗口内已经出现过,需要移动窗口左边界left;
- 移动左边界的方式是通过while循环,判断窗口内的字符是否等于ch,如果不等于ch,则从taskSet中删除该字符,并将左边界left右移一位;
- 最后返回maxLength,即最长连续字符的长度。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestContinuousTasks(string s) {
int n = s.length();
int maxLength = 0;
int left = 0;
unordered_set<char> taskSet;
for (int right = 0; right < n; ++right) {
char ch = s[right];
if (taskSet.find(ch) == taskSet.end()) {
taskSet.insert(ch);
maxLength = max(maxLength, right - left + 1);
} else {
while (s[left] != ch) {
taskSet.erase(s[left]);
left++;
}
left++;
}
}
return maxLength;
}
};

