题目描述:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
题解:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n==0) return 0;
unordered_map<char,int> mp;
int left=0;
int right=0;
int ans=0;
for(right=0;right<n;right++){
if(mp.find(s[right])!=mp.end()){
//当前元素在map中已存在
left=max(left,mp[s[right]]+1);
}
mp[s[right]]=right;
ans=max(ans,right-left+1);
}
return ans;
}
};
解题思路:
定义两个指针作为滑动窗口的左端和右端,初始位置均指向字符串首位元素,遍历数组移动右指针,将当前元素以及其在数组中的位置记录到map中,若遍历到一个元素在map中已存在,即说明该子字符串出现重复元素,移动左端指针到第一个不是重复元素的位置,再将该元素更新map中的当前位置。每遍历一个元素,维护一次当前子字符串的大小。
学习点:
unordered_map与map的区别:
1、实现不同
- unordered_map底层是用哈希表实现的
- map底层是用红黑树实现的
2、性能不同
- unordered_map是不按键值排序的,插入的时间是O(logn),查询时间是O(1)
- map是按键值排序的,插入的时间是O(logn),查询时间是O(logn)
3、使用范围不同
- unordered_map的使用比较局限,它的key只能是int、double等基本类型以及string,而不能是自己定义的结构体
- map可以支持所有类型的键值对
原文链接:https://blog.youkuaiyun.com/weixin_52115456/article/details/127698255
map容器的find函数使用方法:
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
原文链接:https://blog.youkuaiyun.com/kupepoem/article/details/121621860
初始版本:【运行出错】
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n==0) return 0;
if(n==1) return 1;
unordered_map<char,int> mp;
int ans=0;
for(int i=0;i<n;i++){
if(mp[s[i]]==0){
mp[s[i]]++;//将未重复元素填入map中,当前该元素出现次数为1
}else{
unordered_map<char,int>::iterator it=mp.find(s[i]);
mp.erase(mp.begin(),++it);//删除重复元素以及其之前的所有元素
mp[s[i]]++;
}
int m=mp.size();
ans=max(ans,m);
}
return ans;
}
};
该解题思路为将子字符串储存在map中,若出现重复字符,则从map中移除重复字符及其前面的字符。希望有缘人能给予在下该解题方法的错误原因。