LeetCode刷题笔记一

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.

代码:

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        vector<int> dict(256, -1);
        int maxLen = 0, start = -1;
        for (int i = 0; i != s.length(); i++) 
        {
            if (dict[s[i]] > start)
                start = dict[s[i]];
            dict[s[i]] = i;
            maxLen = max(maxLen, i - start);
        }
        return maxLen;
    }
};

思路解析:

对于一个字符串,若它的某个不重复的最长子串结束(假设以X结束),必然是由于X的下一个字符在该子串中出现过。假设不重复子串的第一个字符的前一个字符索引为start,则start往后的某个字符只要在start之后没有出现过,即可归入该不重复子串。

假设最多有256个不同的字符,dict数组用于记录字符串中某个字符上次出现时的位置(这里指在字符串中的索引值)。初始时,不重复子串的第一个字符就是字符串的第一个字符(即start为-1);每个字符的dict数组值都为-1,表示在start之后还未出现过。依次迭代字符串中的每个字符,若字符(设索引为i)没有在start之后出现过,则可归入不重复子串,并记录在start之后出现的位置,放入dict[s[i]];当某个字符在start之后第二次出现时,其dict数组值必然是大于start的,此时就表明一个不重复的最长子串出现,可比价该不重复子串与现有不重复子串的长度,更新最长不重复子串的信息。

寻找下一个不重复子串时,起始位置应当是导致上一个不重复子串结束的字符上一次出现的位置,当时它位于上一个不重复子串中。

复杂度:由于每个字符遍历一次,复杂度为O(n)。

总结:在查找一个字符串中的最长不重复子串时,第一个不重复子串可从字符串的第一个字符向后扩展,直到某个字符再次出现为止,设它为Y;下一个不重复子串应从Y上次出现位置之后开始扩展,以此类推。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值