LeetCode-3. Longest Substring Without Repeating Characters

Description

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.

Solution 1(C++)

class Solution{
public:
    int lengthOfLongestSubstring(string s) {
        int reslen = 0;
        int left = 0, right = 0;
        vector<int> vec(256, -1);
        for(; right<s.size(); right++){
            if(vec[s[right]] != -1){
                left = max(left, vec[s[right]]+1);
            }
            vec[s[right]] = right;
            reslen = max(reslen, right-left+1);
        }
        return reslen;
    }
};

Solution 2(C++)

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;
        }
};

算法分析

搞清楚了题目的意思就比较容易获得算法思路,注意题目要求的是连续子串的长度,所以情况处理就比较简单。

  1. 设定reslen表示连续子串的长度,left表示连续子串的左边界,right表示连续子串的右边界,则reslen=right-left+1。
  2. 让right遍历字符串s,由于要记录遍历过的字符与相应的位置索引,考虑到字符串s中的字符都是ASCII码,所以用一个256位的vec,来记录遍历过的字符,初始值设为-1,表示对应字符没有出现。字符一旦出现,就由-1变成对于字符在s中的索引。
  3. right遍历字符串s,如果字符没有重复出现,就一直便利,如果重复出现,就将重复出现的字符的索引更新为现在的right,并且,left往前移动1位(这样left与right之间的子字符串就又保持所有字符仅出现一次)。
  4. 不断更新当前reslen与right-left+1之间的最大值。直到遍历结束。

注意3中的,left更新时要往前移动一位,所以解法一中使用了:

left = max(left, vec[s[right]]+1);

就是为了防止:对于”abba”,当right遍历到第二个a时,结果left更新到了第一个b处,从而得到错误的答案。

程序分析

略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值