当前位置: 首页 > article >正文

力扣438——找到字符串中的所有字母异位词

我们使用定长的滑动窗口的方法来解决这道题

Python:

from collections import Counter

class Solution:

    def findAnagrams(self, s, p):

        ans = []

        p_counter = Counter(p)

        window_counter = Counter(s[:len(p)])

        if window_counter == p_counter:

            ans.append(0)

        for right in range(len(p), len(s)):

            left = right - len(p)

            window_counter[s[right]] += 1

            window_counter[s[left]] -= 1

            if window_counter[s[left]] == 0:

                del window_counter[s[left]]

            if window_counter == p_counter:

                ans.append(left + 1)

        return ans

C++:

class Solution {

public:

    vector<int> findAnagrams(string s, string p)

    {

        vector<int> ans;

        vector<int> cnt_p(26);

        vector<int> cnt_s(26);

        for(char c:p)

            cnt_p[c-'a']++;

        for(int right = 0;right < s.length();right++)

        {

            cnt_s[s[right] - 'a']++;

            int left = right - p.length() + 1;

            if(left < 0)

                continue;

            if(cnt_s == cnt_p)

                ans.push_back(left);

            cnt_s[s[left] - 'a']--;

        }

        return ans;

        /*

        vector<int> ans;

        array<int, 26> cnt_p{}; // 统计 p 的每种字母的出现次数

        array<int, 26> cnt_s{}; // 统计 s 的长为 p.length() 的子串 s' 的每种字母的出现次数

        for (char c : p) {

            cnt_p[c - 'a']++;

        }

        for (int right = 0; right < s.length(); right++) {

            cnt_s[s[right] - 'a']++; // 右端点字母进入窗口

            int left = right - p.length() + 1;

            if (left < 0) { // 窗口长度不足 p.length()

                continue;

            }

            if (cnt_s == cnt_p) { // s' 和 p 的每种字母的出现次数都相同

                ans.push_back(left); // s' 左端点下标加入答案

            }

            cnt_s[s[left] - 'a']--; // 左端点字母离开窗口

        }

        return ans;

        */

    }

   

};

C:

int* findAnagrams(char* s, char* p, int* returnSize) {

    int * ans = malloc(strlen(s) * sizeof(int));

    *returnSize = 0;

    int cnt_p[26] = {};

    int cnt_s[26] = {};

    for(int i = 0;p[i];i++)

    {

        cnt_p[p[i]-'a']++;

    }

    for(int right = 0;s[right];right++)

    {

        cnt_s[s[right]-'a']++;

        int left = right - strlen(p) + 1;

        if (left < 0)

            continue;

/*

memcmp是 C 语言中的一个函数,用于比较两个内存区域的内容。在这里,它用于比较两个长度为 26 的整数数组 cnt_s 和 cnt_p

cnt_p 数组存储了字符串 p 中每种字母(假设只考虑小写字母,所以用 26 表示 26 个字母)的出现次数。

cnt_s 数组存储了当前正在检查的字符串 s 的子串中每种字母的出现次数。

当 memcmp 返回 0 时,表示两个数组的内容完全相同。这意味着当前子串(窗口)中的字母出现次数与字符串 p 的字母出现次数完全一致,即找到了一个与 p 为字母异位词的子串。

*/

        if(memcmp(cnt_s,cnt_p,sizeof(cnt_s))==0)

            ans[(*returnSize)++] = left;

        cnt_s[s[left]-'a']--;

    }

    return ans;

    /*

    int* ans = malloc(strlen(s) * sizeof(int));

    *returnSize = 0;

    int cnt_p[26] = {}; // 统计 p 的每种字母的出现次数

    int cnt_s[26] = {}; // 统计 s 的长为 n 的子串 s' 的每种字母的出现次数

    int n = 0;

    for (; p[n]; n++) {

        cnt_p[p[n] - 'a']++; // 统计 p 的字母

    }

    for (int right = 0; s[right]; right++) {

        cnt_s[s[right] - 'a']++; // 右端点字母进入窗口

        int left = right - n + 1;

        if (left < 0) { // 窗口长度不足 n

            continue;

        }

        if (memcmp(cnt_s, cnt_p, sizeof(cnt_s)) == 0) { // s' 和 p 的每种字母的出现次数都相同

            ans[(*returnSize)++] = left; // s' 左端点下标加入答案

        }

        cnt_s[s[left] - 'a']--; // 左端点字母离开窗口

    }

    return ans;

    */

}


http://www.kler.cn/a/380990.html

相关文章:

  • ChatGPT之父:奥尔特曼
  • GTID详解
  • 【JAVA】JAVA接口公共返回体ResponseData封装
  • 【游戏设计原理】22 - 石头剪刀布
  • SAP HCM 考勤时间冲突到分 源码分析
  • Vue3之状态管理Vuex
  • stack和queue --->容器适配器
  • Oracle Sql查询和性能优化(持续更新)
  • 掌握 Jest 中的模块模拟:提升单元测试的灵活性与可靠性
  • 【企业微信新版sdk】
  • java.io.FileNotFoundException: Could not locate Hadoop executable: (详细解决方案)
  • JavaCV学习第一课
  • 栈 算法专题
  • SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  • 深入探讨 ESPnet AIShell 项目:ASR 脚本 asr.sh 的实现与解析(一)之脚本前564行,定义各种配置项、函数和条件逻辑
  • Oracle 11g DataGuard GAP处理
  • uniapp实现【时间戳转换为日期格式(年-月-日 时-分-秒)】
  • 10款音视频转文字工具体验记!!!
  • docker构建次数过多导致硬盘爆满,清除
  • mysql上课总结(2)(DCL的所有操作总结、命令行快速启动/关闭mysql服务)
  • 【让中国再次伟大】腾讯开源大语言模型Hunyuan-large,支持高达256K文本序列
  • 基于qt vs下的视频播放
  • [Python学习日记-61] 什么是类与对象?类与对象是什么关系呢?我们该如何定义和使用类与对象呢?
  • 使用 Python 构建代理池并测试其有效性
  • JavaEE初阶----网络原理之TCP篇(一)
  • 10款PDF转Word软件工具的使用感受及其亮点!!!