LeetCode题解 C++ Longest Substring Without Repeating Characters

  • 上周去面试了个小游戏公司,说实话,对于个人触动比较大,很长时间没真正的从心开始写代码了,在学校中的代码基本就是为了去完成工程而写,所以在面对自己具体思想时,会出现偏差。
    具体而言就是那家面试的公司,小小的笔试题,其实很easy,但是思考和动手确实花了很久,不得不去提高自己的姿势水平

下面开始说正题:自己平时写题解,都是写那种需要一点具体思想或者算法的题,包括自己思考出现偏差的题,确实是要自己负责任

3.Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given “abcabcbb”, the answer is “abc”, which the length is 3.

Given “bbbbb”, the answer is “b”, with the length of 1.

Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.


以下是我的思路

我的想法原本是从数组中开始比较前面对应的子串是否有重复,转念一想,这法子实在是太愚蠢了,还不是时间复杂度O(n^2)的吗?

想了想数据结构不是有个KMP算法吗,应该与其中类似,所以自己建立一个数组,长度为26,因为字母总共26个,遍历输入字符串更新visit数组,每次有重复就把数据还原至重复字符串位置的后一位,由于理解是单词于是就很愉快的拿’a’做匹配数组的第0个作为开头去跑。
结果发现原来结果中还有各种字符和大小写,对于维基百科中给出的ASCII 的显示字符共有95个,从space开始,所以我以下代码减去空格也就来源于此。

代码如下:个人感觉还有很多可以优化的余地,也欢迎各位看官提供思路

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int visit[95];

        memset(visit, -1, sizeof(visit));

        int len=0, maxLen = 0;
        for(int i = 0; i < s.size(); i++,len++)
        {
            if(visit[s[i] - ' '] >= 0)
            {
                maxLen = max(len, maxLen);
                len = 0;
                i = visit[s[i] - ' '] + 1;
                memset(visit, -1, sizeof(visit));
            }
            visit[s[i] - ' '] = i;
        }

        return max(len, maxLen);
    }
};

加油QAQ!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值