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

无重复字符的最长子串 lengthOfLongestSubstring

  • 题目描述:
  • 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
思路:滑动窗口
  • 题目关键字:最长字串 ;因为是子串,所以必须是连续的。所以,可以用一个“滑动窗口”来表示符合条件的区域。
  • 滑动窗口的思路:
    • 初始情况:左指针l = 0,右指针r = -1
    • 用一个数组或者mapfreq记录s中字符是否已经出现
    • freq[s[r+1]] == 0r+1 < s.size()表示当前滑动窗口中没有该字符且尚未越界,则我们可以:右移r r++ 同时记录字符freq[s[r]]
    • 当字符已经出现在滑动窗口中,即:不满足上述条件时,表示当前滑动窗口的大小需要调整。同时,记录下此时的最大子串长度 。
    • 那如何调整滑动窗口呢?
      - 当右指针r所在位置的字符,已经出现在滑动窗口中时,表示:此时已经到达目前的最长子串,需要调整窗口:向右移动左指针,同时把s[l]位置的字符移除。
代码如下:
  • 写法一:
class Solution{
public:
	int lengthOfLongestSubstring(string s) {
		int l = 0, r = -1;//左右指针
		vector<int> freq(256, 0);//记录滑动窗口中的字符
		int res;//返回结果,记录子串长度
		while (l < s.size()) {
			//预先判断:r+1位置的字符是否出现在滑动窗口中
			if (r + 1 < s.size() && freq[s[r + 1]] == 0) freq[s[++r]]++;
			else freq[s[l++]]--;//从滑动窗口中去除s[l],也就是最左端的字符
			res = max(res, r - l + 1);
		}
		return res;
	}
};
  • 写法二:(其实是双指针法)
class Solution{
public:
	int lengthOfLongestSubstring(string s) {
		vector<int> freq(256, 0);
		int res = 0;
		for (int i = 0, j = 0; i < s.size(); i++) {
			freq[s[i]]++;
			/*
			while (freq[s[i]] > 1) {
				freq[s[j]]--;
				j++;
			}*/
			while (freq[s[i]] > 1) freq[s[j++]]--;
			res = max(res, i - j + 1);
		}
		return res;
	}
};
贴一下写法二的通过情况:哈哈哈!!
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8 MB, 在所有 C++ 提交中击败了74.61%的用户
通过测试用例:
987 / 987
LeetCode 3.无重复字符的最长子串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值