列表

详情


NC387. 找到字符串中的异位词

描述

给定两个字符串 s 和 p ,请你找到 s 子数组中的全部 p 的异位词的起始点。异位词值可以通过重新排列字符顺序(或者不排列)而相等的词。
你可以以任意顺序返回

数据范围: s 和 p 的长度满足 ,字符串中仅包含小写英文字母

示例1

输入:

"cabac","abc"

输出:

[0,2]

示例2

输入:

"ababab","ab"

输出:

[0,1,2,3,4]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 4ms, 内存消耗: 444KB, 提交时间: 2022-04-19

int* findWord(char* s, char* p, int* returnSize ) {
    // write code here
    int len1 = strlen(s);
    int len2 = strlen(p);
    int* res = malloc(sizeof(int) * len1);
    *returnSize = 0;
    int hash[26] = {0};
    for (int i = 0; i < len2; i++) {
        hash[p[i] - 'a']--;
    }
    int left = 0, right = 0;
    while (right < len1) {
        hash[s[right] - 'a']++;
        while (hash[s[right] - 'a'] > 0) {
            hash[s[left] - 'a']--;
            left++;
        }
        if (right - left + 1 == len2) {
            res[(*returnSize)++] = left;
        }
        right++;
    }
    return res;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 516KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param p string字符串 
     * @return int整型vector
     */
    vector<int> findWord(string s, string p) {
        // write code here
        int hs[26]={0};
        int hp[26]={0};
        vector<int> res;
        for(auto ch:p)
        {
            hp[ch-'a']++;
        }
        for(int left=0,right=0;right<s.size();right++)
        {
            hs[s[right]-'a']++;
            while(hs[s[right]-'a']>hp[s[right]-'a'])
            {
                hs[s[left]-'a']--;
                left++;
            }
            if(right-left+1==p.size())
            {
                res.push_back(left);
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param p string字符串 
     * @return int整型vector
     */
    vector<int> findWord(string s, string p) {
        // write code here
        int hs[26]={0};
        int hp[26]={0};
        vector<int> res;
        for( auto ch:p){
            hp[ch-'a']++;
        }
        for(int left =0,right=0;right<s.size();right++){
            hs[s[right]-'a']++;
            while(hs[s[right]-'a']>hp[s[right]-'a']){
                hs[s[left]-'a']--;
                left++;
            }
            if(right -left+1==p.size()){
                res.push_back(left);
            }
        }
        return res;
        
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-25

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param p string字符串 
     * @return int整型vector
     */
    /*解题思路
    *利用map来记录字符
    *滑动窗口来获取是否匹配
    *利用双指针来遍历 */
    vector <int>findWord(string s,string p)
    {
        //unordered_map<char,int> need,window;
        //用map存储目标值中各字符出现的次数
        unordered_map<int, char>need;
        for(char c:p)   //遍历p所有字符
        {need[c]++;}    //记录字符和个数
        //用map存储窗口中各字符出现的次数,将P数组长度作为滑动窗口的大小
        unordered_map<int,char>window;
        
        int left=0;
        int right=0;
        int valid=0;
        //用vector来返回字母异位词的起始索引
        vector<int>res;  
       //每次窗口移动要把窗口外的那个字符的数量减1,因为他不在窗口内了,每次移动要把新的字符数量进行加1,因为他在窗口内了,移动完毕,我们只要比较窗口内的字符的以及数量是否和P相等即可
        while(right<s.size())
        {
            char c=s[right];
            right++;   //窗口扩大
            //进行窗口内数据的一系列更新
            if(need.count(c))   //如果是目标值
            {
                window[c]++;   //存进字符和它的个数
                //
                if(window[c]==need[c])   //如果window字符\个数都和need相同
                {valid++;}     //有效值+1
            }
        
            while(right-left>=p.size())
           {   
                 if(valid==need.size())   //如果窗口符合条件
                  res.push_back(left);   //把起始索引存进res
                 char d=s[left];
                 left++;  //窗口缩小
                if(need.count(d))
                {
                if(window[d]==need[d])
                  valid--;
                window[d]--;
   
               }
           }
        }return res;
    }
    
};

C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-19

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param p string字符串 
     * @return int整型vector
     */
    vector<int> findWord(string s, string p) {
        int a[26] = {0};
        vector<int> ans;
        int b = 26;
        for (auto &i : p) {
            b -= !a[i - 'a']++;
        }
        for (int i = 0, j = 0, n = s.size(); i < n; ++i) {
            b += !--a[s[i] - 'a'];
            while (a[s[i] - 'a'] < 0)
                b -= !a[s[j++] - 'a']++;
            if (b == 26)
                ans.push_back(j);
        }
        return ans;
    }
};

上一题