题目
给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度
示例1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是?“wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke”?是一个子序列,不是子串
分析
1.也是先根据所给示例,进行手动模拟,其实就是可以理解为一个滑框,如果是未出现重复,则将其加入框中,
首先出现重复的话,则滑框需要界定边界,需要重新设置左边界。
2.m[s[i]] < left加这个的原因就是因为如果遇到重复,重新定义左边界后,之前的元素可能还会出现在新滑框中
所以如果值小于left,仍需计算
tips:
1.针对给定数组中记录是否出现重复,可以借鉴hashmap,比如就是用数组建立一个hash表,初始值全为0,然后
根据依次根据题目给的数组中修改hash表中的值
2.如果边界重新划定后,如何记录之前的最大值,可以用max函数来将最大值存储起来。如果重新划定边界后,
么有之前的大,则继续用之前的结果,如果比之前的结果大,则会更新为新结果。
3.也可以用stl库。但是性能会差,vector > set
#include<string>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
class MyClass
{
public:
int lengthOfLongestSubstring(string s) {
int res = 0, left = 0;
int m[256] = {0};
for (int i = 0; i < s.size(); ++i){
if (m[s[i]] == 0 || m[s[i]] < left){
res = max(res, i - left + 1);
}
else
{
left = m[s[i]];
}
m[s[i]] = i + 1;
}
return res;
}
};