m0_61574664 2021-12-03 20:27 采纳率: 87.1%
浏览 94
已结题

无重复字符的最长子串基础题

class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 哈希集合,记录每个字符是否出现过
unordered_set occ;
int n = s.size();
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1, ans = 0;
// 枚举左指针的位置,初始值隐性地表示为 -1
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.erase(s[i - 1]);
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {
// 不断地移动右指针
occ.insert(s[rk + 1]);
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1);
}
return ans;
}
};
问:这段代码我没有找到他是如何判断指针内外有没有重复的字符,运用了什么原理
问: int rk = -1, 他的右指针的初始值是—1,那他的左指针的初始值呢。
问: // 枚举左指针的位置,初始值隐性地表示为 -1
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.erase(s[i - 1]);
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {
// 不断地移动右指针
occ.insert(s[rk + 1]);
这个从头到尾我都没见到他是如何判断是否有重复的字符,我只看到了左右指针不停地移动,他这个左右指针是如何协调的呢

  • 写回答

2条回答 默认 最新

  • togolife 2021-12-03 20:55
    关注
    1. 用的unordered_set判断是否有重复,这个是c++基础库中提供的一个模板。类似set,用来去重
      occ.count(s[rk + 1]),判断是否已经存在,如果存在会返回1。不存在返回0
    2. 左指针就是i,初始值为0
    3. 比如字符串abcdeaf
      左指针i = 0, 右指针rk可以一直累加到4也就是e的位置。然后继续累加会有重复'a',结束右指针的循环。ans = 5
      然后左指针i = 1,并删除unordered_set中的a,右指针rk可以继续累加到f位置。ans = 6
      然后左指针i = 2,右指针已经到了末尾,不用循环了,此时得到ans 仍然为6
      后序移动左指针都是无效操作了,因为不可能再比ans大
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 已采纳回答 12月4日
  • 创建了问题 12月3日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装