leetcode思路总结反思(尺取法)
模板:
- Find All Anagrams in a String
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res;
unordered_map<char,int> map_;
for(auto c:p)
map_[c]++;
//尺取法
int begin_=0,end_=0,sum=map_.size();
for(;;)
{
while(end_<s.size()&&sum!=0)
{
if(map_.find(s[end_])!=map_.end())
if(--map_[s[end_]]==0)
sum--;
end_++;
//end_++需要写在if语句的外面
}
if(sum!=0)
break;
if(end_-begin_==p.size())
res.push_back(begin_);
if(map_.find(s[begin_])!=map_.end())
if(++map_[s[begin_]]>0)
sum++;
begin_++;
//begin_++需要写在if语句的外面
}
return res;
}
};
需要注意的地方:end_++和begin_++都需要写在if语句的外面,每次while循环出来如果不是到达尾端那么begin_到end_之间的一段便刚好包括所需,再判断这一段是否满足条件。
类似题
567 :Permutation in String
76:Minimum Window Substring
30:Substring with Concatenation of All Words
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(s.empty()||words.empty()||s.size()<words[0].size())
return res;
int len = words[0].size();
string tmp_str;
for(int i=0;i<len;i++)
{
//重新初始化map_
unordered_map<string,int> map_;
for(auto w:words)
map_[w]++;
int s_=i,t_=i,sum_=map_.size();
for(;;)
{
while(t_<s.size()&&sum_!=0)
{
tmp_str=s.substr(t_,len);
if(map_.find(tmp_str)!=map_.end())
{
if(--map_[tmp_str]==0)
sum_--;
}
t_+=len;
}
if(sum_!=0)
break;
if((t_-s_)/len==words.size())
res.push_back(s_);
tmp_str=s.substr(s_,len);
if(map_.find(tmp_str)!=map_.end())
{
if(++map_[tmp_str]>0)
sum_++;
}
s_+=len;
}
}
return res;
}
};
该题会多次运用尺取法,每个for循环之前都需要重新初始化map_!!!