c++滑动窗口进阶版求找到字符串中所有字母异位词

故事扮演 提交于 2019-12-02 22:04:19
/**
 * 问题:找到字符串中所有字母异位词
 * 要求:给定一个字符串 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;
    }
}
 */

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!