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

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

原文地址:https://www.cnblogs.com/z2529827226/p/11764184.html

时间: 2024-10-10 00:08:30

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

leetcode 438. 找到字符串中所有字母异位词(Find All Anagrams in a String)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: 字母异位词指字母相同,但排列不同的字符串. 不考虑答案输出的顺序. 示例 1: 输入: s: "cbaebabacd" p: "abc" 输出: [0, 6] 解释: 起始索引等于 0 的子串是 "

[LeetCode]438. 找到字符串中所有字母异位词

题目 给定一个字符串?s?和一个非空字符串?p,找到?s?中所有是?p?的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串?s?和 p?的长度都不超过 20100. 说明: 字母异位词指字母相同,但排列不同的字符串. 不考虑答案输出的顺序. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明

438.找到字符串中所有字母异位词

class Solution: def findAnagrams(self, s: str, p: str) -> List[int]: l=0 r=0 res = [] p_d = {} windows_d = {} for _ in p: p_d[_] = p_d.get(_,0)+1 while(r<len(s)): #如果字母不在子串中,清空窗口字典,同时移动左右窗口 if s[r] not in p: l=r=r+1 windows_d.clear() #当字母在子串中,窗口字典计数

Java 练习:求指定字符串中大写字母,小写字母,其他字符分别的个数。

/* public class Test1{ public static void main(String[]args){ String s = "abcdeEFHDKEI38475 "; char a[] = s.toCharArray(); int lower = 0,upper = 0,other = 0; for(int i=0; i<a.length; i++){ if(a[i]<='z' && a[i]>='a') lower++; els

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

spoj 694 求一个字符串中不同子串的个数

SPOJ Problem Set (classical) 694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number of its distinct substrings. Input T- number of test cases. T<=20; Each test case consists of one string, whose length is <=

python学习:找到字符串中第一个只出现一次的字母

''' 找出字符串中第一个只出现一次的字符 ''' def searFisrt(str):     #定义一个数据字典     dic={}     for i in range(len(str)):         if str[i] in dic:             dic[str[i]]+=1         else:             dic[str[i]]=1     for i in range(len(str)):          if dic[str[i]]==1

求一个字符串中连续出现最多的子串次数

时间:2014.09.12 地点:基地 心情:明天就要和欧阳去武汉面试阿里了,整理一下同学求助的一道题,写下这一篇,愿一切顺利. 一.题目: 求一个字符串中连续出现最多的子串次数:例如字符串abcbcbcabc,连续出现次数最多的子串是bc,出现次数为3. 二.分析 方法:后缀思路 比如题目中举例中的字符串,它的后缀有: abcbcbcabc  0 bcbcbcabc  1 cbcbcabc  2 bcbcabc  3 cbcabc  4 bcabc  5 cabc  6 abc  7 bc  

求一个字符串中连续出现的次数最多的子串

求一个字符串中连续出现的次数最多的子串.例如字符串“abababc”,最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次