Leetcode-3: Longest Substring Without Repeating Characters

本文介绍了一种使用双指针结合哈希表的方法来寻找字符串中最长无重复字符子串长度的算法实现。该算法的时间复杂度为O(n),通过不断调整窗口大小确保子串内字符唯一,适用于多种字符串匹配场景。

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

这题不算难,但是很多边边角角需要考虑。短时间内写出bug-free的代码我觉得不容易。

需要注意:

1) 用双指针+map就可以了。时间复杂度O(n)。

2) 注意m[ch]记录的是字符ch的位置。如果以前有冲突的话,m[ch]要更新。

3) 返回maxLen。当位置j的ch与前面的ch有重复,但前面的ch已经<i,则不用考虑。case "tmmzuxt"。
4) 当j到达末端时, 若无冲突,需要考虑是否更新maxLen。case "aab"。
5) 不管是否有冲突, m[ch]都要更新。

#include <iostream>
#include <string>
#include <map>

using namespace std;

int lengthOfLongestSubstring(string s) {
    size_t i=0, j=0;
    map<char, int> m;
    size_t s_len=s.size();
    size_t maxLen=0;
    //string ret_str;   //for debug

    while((i < s_len) && (j<s_len)) {
       char ch = s.at(j);
       if ((m.count(ch)==0) || (m[ch]<i)) {   //m[ch]<i is for the case "tmmzuxt"
           if (j==s_len-1) maxLen=max(maxLen, j-i+1);   //for the case "aab"
        }else {
           if (maxLen < j-i) {
               maxLen = j-i;
            //   ret_str = s.substr(i, j-i);   //for debug
           }
           i=m[ch]+1;   //due to conflict, move i to the first place of conflict plus 1.
       }
       m[ch]=j++;
    }
    return (int)maxLen;
}

int main()
{
    string s1="au";
    string s2="pwwkew";
    string s3="";
    string s4="babcda";
    string s5="abcabcbb";
    string s6= "aab";
    string s7="nfpdmpi";
    string s8="tmmzuxt";
    cout<<lengthOfLongestSubstring(s1);
    cout<<lengthOfLongestSubstring(s2);
    cout<<lengthOfLongestSubstring(s3);
    cout<<lengthOfLongestSubstring(s4);
    cout<<lengthOfLongestSubstring(s5);
    cout<<lengthOfLongestSubstring(s6);
    cout<<lengthOfLongestSubstring(s7);
    cout<<lengthOfLongestSubstring(s8);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值