leetcode 3 Longest Substring Without Repeating Characters

本文给出leetcode第三题Longest Substring Without Repeating Characters的答案及所用到的简单知识总结,适用于C++初学者
本文代码下载地址

目录


题目

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.

滑动窗方法

#include<iostream>
#include<map>
#include<string>

using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,int> My_map;
        int begin = 0;
        int end = 0;
        int l = 0;
        for(int i=0;i<s.length();i++){
            if(!My_map.count(s[i])){
                My_map.insert(pair<int,int>(s[i],i));
            }
            else if(My_map.count(s[i]) && My_map.find(s[i])->second < begin){
                My_map.find(s[i])->second = i;
            }
            else{
                begin = My_map.find(s[i])->second + 1;
                My_map.find(s[i])->second = i;
            }
            end = i;
            l = l>(end-begin+1)?l : (end-begin+1);
        }

        return l;
    }
};

int main(){
    Solution t;
    string s = "aaaaa";
    int l = t.lengthOfLongestSubstring(s);
    cout << l;

    system("pause");
    return 0;
}

求解此题目时我采用滑动窗的方法,定义变量 begin 与 end 分别记录滑动窗的开始与结束位置。定义 map 变量 My_map 以便快速判断读取的第 i 位字符是否与当前滑动窗中的字符重复。

对 string s 中的每一个字符,首先利用语句My_map.count(s[i])判断它是否与 My_map 中的变量重复,若没有重复,则可以将当前字符加入到 substring 中去, 将当前字符下表 i 赋值给滑动窗结尾位置 end。

若出现重复,即当前字符已经在 My_map 中的键值出现过,则进而要判断 My_map 中该键值指向的 value 值是否存在于当前的滑动窗中。我们使用语句 My_map.find(s[i])->second < begin 进行上述判断。若上述语句返回 true,说明 My_map 中该键值指向的 value 值不在当前滑动窗,我们需要更新该键值指向的 value 值,同时将滑动窗的结尾符 end 向后移动一位。

My_map.find(s[i])->second < begin 返回 false ,则说明字符 s[i] 已经存在于当前的滑动窗中,此时需要将滑动窗的起始符移动至重复字符第一次出现位置的后一位,具体示意图如下:
fig.1
假设 begin 开始为字符 a 的下标, i 指向当前的字符串位置,当读取到字符 b 时,程序会检测到字符 b 已经在 substring 中出现过,则将 substring 中字符 b 出现的位置的后一位赋给变量 begin ,同时 end 向后移一位。

此程序整体运行效率不高,只有 13%,需要继续努力。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值