/**
* 问题:找到字符串中所有字母异位词
* 要求:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
* 注意事项:字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
* 方法1:利用滑动数组去做
* class Solution {
private:
vector<int>list;
int a[26]={0};
int b[26]={0};
public:
vector<int> findAnagrams(string s, string p) {
if(s.length()==0||p.length()==0||s.length()<p.length())return list;
for(int i=0;i<p.length();++i){
a[s[i]-'a']++;
b[p[i]-'a']++;
}
int left=0;
int right=p.length();
while(right<s.length())
{
if(isValid(a,b))list.push_back(left);
a[s[left++]-'a']--;
a[s[right++]-'a']++;
}
if(isValid(a,b))list.push_back(left);
return list;
}
public:
bool isValid(int a[],int b[])
{
for(int i=0;i<26;++i)
if(a[i]!=b[i])return false;
return true;
}
};
* 方法2:利用图的思想去做,把p的元素都放在map中,再依次遍历s一旦有就立即往后检验
* 方法3:KMP算法
* 方法4:暴力+hashMap(最后一个案例会超时)
* class Solution {
private List<Integer>list=new ArrayList<Integer>();
private Map<Character,Integer>mm=new HashMap<Character,Integer>();
public List<Integer> findAnagrams(String s, String p) {
if(s.length()<p.length())return list;
for(int i=0;i<p.length();++i)
mm.put(p.charAt(i), mm.get(p.charAt(i))==null?1:mm.get(p.charAt(i))+1);
int m=s.length();
int n=p.length();
for(int i=0;i<=m-n;++i)
if(mm.containsKey(s.charAt(i))&&isValid(s,p,i,i+n-1))list.add(i);
return list;
}
public boolean isValid(String s, String p,int left,int right)
{
Map<Character,Integer>map=new HashMap<Character,Integer>();
for(int i=left;i<=right;++i)
map.put(s.charAt(i), map.get(s.charAt(i))==null?1:map.get(s.charAt(i))+1);
if(mm.size()!=map.size())return false;
for(int i=0;i<p.length();++i) {
if(map.containsKey(p.charAt(i))&&map.get(p.charAt(i))!=0)map.put(p.charAt(i), map.get(p.charAt(i))-1);
else return false;
}
return true;
}
}
*/