开始力扣吧~
无重复字符串最长字串
给定一个字符串 s
,请你找出其中不含有重复字符的最长子串的长度。
让我捋一遍逻辑:
建立一个滑动窗口
设置左指针、右指针,两个指针中间的部分是窗口,左右指针最开始先指向最左侧
设置一个散列表存储窗口,key为s中的值,value为是否出现在窗口中的判断(1出现、0没出现)
设置记录最大长度的数
大循环
{
右指针一次向右挪一位,判断新加入到窗口的数字是否在散列表中
{
不在的话,相应位置的value改为1,右指针向右挪一个位置;
在的话,退出循环;
}
退出循环时说明右面走到底或者右键所指的值已经出现在窗口中了
最大长度赋值为当前最大长度和(右-左)二者中的最大值
出现重复后缩小窗口
{
左值往右挪,挪到与右值重复的值的右面一个位置
}
}
写!!!!
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left=0,right=0,maxL=0;
//散列表
unordered_map<int,int> odd;
//右指针不出界时
while(right<s.size())
{
//右值不在散列表
while(right<s.size()&& !odd[s[right]])
{
odd[s[right]]=1;
++right;
}
//最大长度
maxL=max(maxL,right-left);
//缩小窗口
while(left<right)
{
odd[s[left]] = 0;
if(s[left++]==s[right]){break;}//先left比较,后left值加1
}
}
return maxL;
}
};
补充:散列表unordered_map
unordered_map是key-value关联容器,直接根据key值查找对应的value,查询单个值的效率高,二者数据类型可以不同,key唯一但没有存储顺序
简单操作:定义、insert增加、find查找、erase删除、end终点
unordered_map<string, int> exampleMap;
exampleMap.insert("Ming", 1);
exampleMap.erase("Ming");
exampleMap.find(x) != exampleMap.end();
要是加入迭代器:
unordered_map的迭代器是一个指向此元素的指针,可以通过迭代器获取它的值。first、second等可以获取相对应位置的值
例如eMap<键,值>,则eMap.first为键,eMap.second为值
unordered_map<K,V>::iterator it_M;
(*it_M).first; // 键K
(*it_M).second; // 值V
(*it_M); // <键,值>对
//或写为
it_M->first;
it_M->second;