3. Longest Substring Without Repeating Characters

3. Longest Substring Without Repeating Characters

题目:

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:

Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:

Input: “pwwkew”
Output: 3
Explanation: 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.
求最长不含重复字符的子字符串的长度。

解法:

O(n):使用hash的方法,用一个hash数组来记录每个字符上一次出现时在原字符串中的位置,用f(i)表示以字符串中第i个字符为结尾的不包含重复字符的子字符串时的最长长度。
如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1;
如果第i个字符出现过,分两种考虑,一种是上一次出现距离这次出现之前的距离d大于f(i-1),则表示以第i-1个字符结尾的最长的不包含重复字符的子字符串中不包含第i个字符,所以f(i)=f(i-1)+1;
第二种就是两个相同的字符出现的距离d小于f(i-1),则f(i) = d。
不停扫描字符串,直到整个字符串都被扫描,返回f中的最大值。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int curLen = 0;
        int maxLen = 0;
        int pos[256];
        memset(pos,-1,sizeof(int)*256);
        for(int i = 0;i < s.length();i++)
        {
            if(pos[s[i]] == -1 || i-pos[s[i]] > curLen)
                curLen++;
            else
            {
                if(maxLen < curLen)
                    maxLen = curLen;
                curLen = i - pos[s[i]];
            }
            pos[s[i]] = i;
        }
        if(maxLen < curLen)
            maxLen = curLen;
        return maxLen;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值