LeetCode3:Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

一、题目描述

基本意思是从字符串中找出不含重复字符的最大长度子串,输出最大子串的长度,例如字符串“abcdab”的最大子串为“abcd”,长度即为4。

二、解题思路

分析:假设子串里含有重复字符,则父串一定含有重复字符,单个子问题就可以决定父问题,因此可以利用贪心法求解。
从左往右扫描,当遇到重复字母时,将上一个重复字母的index+1,作为新的搜索起始位置,直到字符串的最后一个字母。
算法时间复杂度O(n),空间复杂度O(1)。因为ASCLL码字符个数128个,这里用unorder_map打表记录每个字符在字符串中最后出现的位置,unordered_map的空间消耗最大为128,所以时间复杂度是常数级的。unordered_map的查找插入操作的时间复杂度都是O(1),所以整个算法的时间度为O(n)。


#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
		unordered_map<char, int> map;//map记录遍历过程中每个字符最后出现的位置
		int mLength = 0, i = 0, j = 0; //mLength记录不重复字符子串的最大长度,i记录当前不重复子串的起点,j记录当前不重复子串的终点

		while (j<s.size()){ //遍历字符串
			if (map.find(s[j]) != map.end() && map[s[j]] >= i) //如果当前维护的不重复子串中出现了s[j]
				 //在找是否出现重复字符的时候,一定要在当前考察的子串的范围内查找,所以条件 && um[s[i]]  >= j不能漏
				i= map[s[j]] + 1;   //更新i
			else  //如果当前维护的不重复子串中没有出现s[j]
				mLength = max(mLength, j - i+ 1); //更新结果,取较大者

			map[s[j]] = j; //更新mLength
			j++;
		}
		return mLength;
	}
};

int main()
{
	string s1 = "abcdabc";
	Solution Sol;
	int n = 0;
	n = Sol.lengthOfLongestSubstring(s1);
	cout << "The length of longest substring is : " << n << endl;
	system("pause");
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值