面试题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),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值