题目:
分析:自己想了会没想出来。
自己想的是把目标排序,然后以固定窗口在长字符串上滑动,窗口内的直接排序。
那为什么不借助一个哈希呢?
代码,直接map出问题了:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
map<char,int> m1,m2;
for(int i=0;i<p.size();i++)
{
m1[p[i]]++;
}
vector<int> v;
if(s.size()<p.size()) return v;
for(int i=0;i<p.size();i++)
{
m2[s[i]]++;
}
if(m1==m2) v.push_back(0);
for(int i=0,j=p.size();j<s.size();i++,j++)
{
cout<<j<<endl;
m2[s[j]]++;
m2[s[i]]--;
cout<<m2['a']<<m2['b']<<m2['c']<<m2['d']<<m2['e']<<endl;
if(m1==m2) v.push_back(i+1);
}
return v;
}
};
自己测试,发现是c++ map的原因:
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,int> m1;
m1[1]=1;
m1[2]=2;
m1[3]=3;
map<int,int> m2;
m2[1]=1;
m2[2]=2;
m2[3]=3;
if(m1==m2) cout<<"相等!"<<endl;
else cout<<"不相等!"<<endl;
m2[4]=0;
if(m1==m2) cout<<"相等!"<<endl;
else cout<<"不相等!"<<endl;
if(m1[4]==0) m1[4]=0;
if(m1==m2) cout<<"相等!"<<endl;
else cout<<"不相等!"<<endl;
m1[4]++;
m1[4]--;
if(m1==m2) cout<<"相等!"<<endl;
else cout<<"不相等!"<<endl;
}
那么,按道理说加上if(m1[s[j]]==0) m1[s[j]]=0;就可以啦,但是依然不行,不知道为什么?
总之,map的相等要慎用!·
改为一般的哈希:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> m1(26,0),m2(26,0);
for(int i=0;i<p.size();i++)
{
m1[p[i]-'a']++;
}
vector<int> v;
if(s.size()<p.size()) return v;
for(int i=0;i<p.size();i++)
{
m2[s[i]-'a']++;
}
if(m1==m2) v.push_back(0);
for(int i=0,j=p.size();j<s.size();i++,j++)
{
m2[s[j]-'a']++;
m2[s[i]-'a']--;
if(m1==m2) v.push_back(i+1);
}
return v;
}
};