最长无重复字符子串

1 题目

Given a string,find the length of the longest substring without repeating characters. Forexample, 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.

2 分析

思路一:最简单直接的方法是从字符串的每个字符w出发检测出最长无重复子串的长度,最后取最大值。时间复杂度O(nAve(subStr)),其中n为字符串长度,Ave(subStr)表示从所有位置出发最大子串的长度。

思路二:例如字符串s = “abcdcf”,从字符串的0位置出发,在4时遇到重复字符”c”,按照思路一下一步从位置1出发开始计算。不难发现,从位置1、2出发的子串长度不会大于从0位置出发的子串长度,因此不需要计算从位置1、2出发的最长子串,只需从位置3开始。从位置3开始时,只需回撤位置0、1、2的标志位即可,无需真正从位置3开始。综上字符串每个位置的元素访问2次,因此时间复杂度O(n)。

3 实现

思路二的代码实现如下:

int lengthOfLongestSubstring(string s)
{
      int maxLen = 0;
      int len = 0;
      int start = 0;
      int isFirst[128] = {-1};
      for (int i = 0; i < 128; ++i)
      {
             isFirst[i] = -1;
      }
      int cur = 0;
      int size = s.length();
      char ch;
 
      while (cur < size)
      {
             ch = s[cur];
             if (isFirst[ch] > -1)
             {
                    int temp = isFirst[ch];
                    maxLen = max(maxLen, len);
                    len = len - (temp - start +1);
                    while (start <= temp)
                    {
                           isFirst[s[start++]] =-1;
                    }
             }
             isFirst[ch] = cur;
             ++len;
             ++cur;
      }
      maxLen = max(maxLen, len);
 
      return maxLen;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值