leetcode 3.无重复字符的最长子串

leetcode 3.无重复字符的最长子串

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路

方法一:

使用双层循环的方法去匹配

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int res = 0;
        for(int i=0; i<s.size(); i++){
            set<char> temp; // 用于存储不相同的元素
            int count = 0;
            for(int j=i; j<s.size(); j++){
                if(temp.find(s[j]) == temp.end()){  // 查找是否含有该字符
                    count++;                        // 记录不重复的字符的个数
                    temp.insert(s[j]);              // 没有找到,直接在集合中插入
                }
                else{                           
                    break;                           // 表示找到了重复的字符,直接退出
                }
            }
            if(count > res){                        // 更新结果,把最长的子字符串存储在res中
                res = count;
            }
        }
        return res;
    }
};

方法二: 滑动窗口的解法

假设有一个子字符串 s i j s_{ij} sij,我们要知道第 j j j个字符是否在 s i j s_{ij} sij中,采用不断的去 i i i开始取出来,与 j j j相比较。如果全都不相等, j j j往前进一步,如果中间有一个相等的,那么 i = i n d e x i=index i=index,那么不相等的子字符串的长度就是 i − j + 1 i-j+1 ij+1。代码如下

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int index = 0, maxLen = 0;
        for (int i=0; i<s.size(); i++){
            for(int j = index; j < i; j++){
                if(s[j] == s[i]){
                    index = j+1;
                    break;
                }
            }
            if((i-index+1) > maxLen){
                maxLen = i-index+1;
            }
        }
        return maxLen;
    }
};

升级一下,用哈希表映射的方法。把字符串中每个字符的下标都映射到对应的位置,这样当找到重复的字符,就直接跳到对应的左侧窗口的位置,没有找到重复的就不断的下标向前走,并且记录当前子字符串的长度。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> ascii(256, 0);
        int index = 0, maxLen = 0;
        for(int i=0; i<s.size(); i++){
            if(index < ascii[s[i]]){
                index = ascii[s[i]];
            }
            ascii[s[i]] = i+1;
            if(maxLen < (i-index+1)){
                maxLen = i-index+1;
            }
        }
        return maxLen;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值