LeetCode -- Longest Substring Without Repeating Characters

本文介绍了一种求解最长无重复子串的算法实现,使用C++编程并通过XCode进行调试。通过双指针技术和哈希表记录字符出现状态,有效解决了LeetCode上的经典问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

可以这样学习算法:
Mac有神器CodeRunner,可是只能运行不能调试。
所以我用XCode的新建OSX Application下的Command Line Tool项目:
然后 打断点!!

题目
Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1.

提示 Hash Table Two pointers

思路:

找到 最长的 没有重复子母的 字符串的 长度

LeetCode上给了参考答案:
我把它写到了XCode中:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int lengthOfLongestSubstring(string s) {
    int n = (int)s.length();
    int i = 0, j = 0;
    int maxLen = 0;
    bool exist[256] = { false };
    while (j < n) {
        if (exist[s[j]]) {
            maxLen = max(maxLen, j-i);
            while (s[i] != s[j]) {
                exist[s[i]] = false;
                i++;
            }
            i++;
            j++;
        } else {
            exist[s[j]] = true;
            j++;
        }
    }
    maxLen = max(maxLen, n-i);
    return maxLen;
}

int main(int argc, const char * argv[]) {
    string s = "abcabcbb";
    int length = lengthOfLongestSubstring(s);
    printf("length: %d\n", length);
    return 0;
}
说明:
  1. exist[]很精髓,字母放入后,下标是该字母在ASCII码的值。 ASCII码长度只有128位,但是它初始256位,原因暂不清楚。
  2. 外层while在改变j的值,j最多从0改变到n(n为字符串的长度),内层while在改变i的值,同样的,i最多从0改变到n(n为字符串的长度)。所以加起来,时间复杂度为O(2*N),也就是O(N)。
  3. 在循环体之外,还要写上,maxLen = max(maxLen, n-i)。这是为什么呢? 因为可能最后一次检查的时候,j知道走到字符串末尾都没有遇到重复字符。而while循环体中找到的最长不重复子串只是在j遇到重复字符时才进行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值