面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法

最初的思路遍历每个字符,找到以它开始的最长的子串。俗称暴力法,确实很暴力,时间复杂度达到O(n^3),唯一的好处是它能解决问题。暴力遍历法的大概流程是准备一个hash字符数组,然后遍历每个字符放到hash表里,有重复的则记录子串长度,然后重置hash表并从下一个字符开始。

滑动窗口解法时间复杂度可以达到O(n),相较于暴力法节省了不少,但其思路和暴力法却没有根本差异,都是遍历字符,难就难在不容易想到。暴力解法每次遇到重复的字符都会从下一个字符开始,滑动窗口则是从冲突的字符下一位开始继续往下找,已经确定不重复的就不用重复比较了。假定窗口存储了最长子串,头尾指针分别记为head, end。下一个字符指针是( end + 1),将该字符和[ head, end ]比较,如果在位置i 出现相同,则记录当前子串长度(end - head),将窗口指针跟新为( i + 1, end + 1),如此比较,直到走到末尾,返回最大长度即可,确实省了很多重复计较。

//滑动窗口解法
int lengthOfLongestSubstring(char * s){
    int head, end, cur, len = 0, max = 0;
    head = end = 0;
    
    while(s[end] != '\0')
    {
        if (head != end)
        {
            cur = head;
            while(cur < end)
            {
                if (s[cur++] == s[end])
                {
                    head = cur;
                    break;
                }
            }
        }
        max = max > (end - head + 1) ? max : (end - head + 1);
        end++;
    }
    
    return max;
}

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。
 

你可能感兴趣的:(Leetcode)