leetcode3. Longest Substring Without Repeating Characters

本文介绍了一种解决LeetCode第3题“无重复字符的最长子串”的算法。通过使用数组记录字符位置,实现高效查找和更新。文章详细解释了如何通过游标遍历字符串并更新最长子串长度。

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

leetcode3. Longest Substring Without Repeating Characters

思路

  1. 用一个数组保存当前迭代过程内的子串中每个字符出现的位置charPos,用hash的方式,并初始化-1(初始化的值不能是任何可能的位置值,如0);
  2. 定义一个游标指针,扫描字符串s,如果当前的字符在本次子串中没有重现(charPos[s[curPos]]<-1),更新该子串长度、该子串所有字符出现的位置数组和当前的游标,如果当前的字符在本次子串中重现了(charPos[s[curPos]]>-1),那么,更新最大子串长度,重置位置记录数组charPos和子串长度,并更新游标;
  3. 循环2,知道游标遍历了数组;
  4. 考虑最后一个子串的情况(游标已经遍历数组,但是因为没有遇到重现的情况,导致最后一个字符长度和当前最长长度没有进行对比),最后返回;
class Solution {
public:
    int lengthOfLongestSubstring(string s) {

        int charPos[130] = { 0 };
        memset(charPos, -1, 130 * sizeof(int));
        int size = s.size();
        int curPos = 0;
        int curLen = 0;
        int maxLen = 0;
        while (curPos < size)
        {
            if (charPos[s[curPos]] <= -1) {
                curLen++;
                charPos[s[curPos]] = curPos;
                curPos++;
            }
            else {
                maxLen = curLen > maxLen ? curLen : maxLen;
                curLen = 0;
                curPos = charPos[s[curPos]] + 1;
                memset(charPos, -1, 130* sizeof(int));
            }

        }
        maxLen = curLen > maxLen ? curLen : maxLen;
        return maxLen;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值