LeetCode 003 Longest Substring Without Repeating Characters

题目大意是给出一个字符串,要求其最长连续子串,连续子串中不能有重复字符(charactor)。

拿到题目首先应该问:字符串多长,内存是否存得下?当然在OJ上内存肯定是存得下的。然后要问字符串中的字符都是什么字符,只有小写字母吗?还是0~127的ASCII字符?又或者是0~255的ASCII字符?需要注意的是C++的string是signed char,如果是0~255的ASCII字符就需要转换成unsigned char。在这题里面只有0~127。还需要注意边界条件,假如输入的string是空串,程序会不会出错。

看到题目的第一反应是最暴力的方法,即枚举子串的开始点和结束点,并对每个子串扫描是否有重复的字符。这个算法的时间复杂度是O(n^3)。

然后考虑是否有更快的算法。就可以想到其实并不需要每次都扫描子串,因为在从开始点到原字符串末尾枚举子串结束点的时候,就可以顺便维护一个字符是否出现的列表,以此判断子串是否符合要求。时间复杂度是O(n^2)。

接着思考是否还可以降低时间复杂度,马上想到我们只需要维护一个区间,保证区间内的子串是满足要求的,并不需要枚举开始点和结束点。因为子串是连续的,一旦末尾加入了重复字符,再增长末尾也没有用了,所以直接前移开始点即可。所以算法就是:开始的区间仅含有第一个字符;前移结束点直到子串不满足要求,前移开始点。一直重复直到不能再前移开始点为止。时间复杂度为O(n)。空间复杂度为常数,因为只需使用一维数组记录每个字符是否出现。

因为我用的是C++,还可以再思考一下常数上的优化,比如使用迭代器而不是下标访问string,甚至直接使用指针访问string.c_str()。我试了一下,使用指针可以击败百分九十多的submission。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值