/** * 问题:找到字符串中所有字母异位词 * 要求:给定一个字符串 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; } } */