[6]力扣每日一题

题目呈现如下:

思路介绍:

采用滑动窗口算法,有点类似于低配版的KMP,比较容易,具体实现见AC代码注释.有些细节还是比较值得注意的.

下附AC代码:

class Solution {
public:
    static int lengthOfLongestSubstring(string s) {
        int isSeen[128]; // 由于题目中出现的是ASCII码,所以用数组是绰绰有余了,不必用到哈希
        memset(isSeen, 0, sizeof(isSeen));
        int le = 0, ri = -1, ans = 0; // 最需要注意的是右侧指针ri的初始值,因为子串s[0]~s[0]也是必须要判断滴~
        int len = s.length(); // 这个需要注意一下,每次求s.length(),时间复杂度为O(n)的..
        for (; le < len; ++le) { 
            if (le > 0) isSeen[s[le - 1]] = 0;
            while (isSeen[s[ri + 1]] == 0 && ri < len - 1) isSeen[s[++ri]] = 1; // 注意,是往ri右侧一个字符眺望的
            ans = max(ans, ri-le+1);
        }
        return ans;
    }
};

猜你喜欢

转载自www.cnblogs.com/tsuipo/p/12819817.html