不含有重复字符的最长子串

题目

给定一个字符串,请你找出其中不含有重复字符的?最长子串?的长度
示例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
#include
#include
#include

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

你可能感兴趣的:(学习笔记)