C刷题:LeetCode 438.找到字符串中所有字母异位词(中等) || 滑窗技巧

C刷题:LeetCode 438.找到字符串中所有字母异位词(中等) || 滑窗技巧

  • 实现代码

作者:来知晓
公众号:来知晓
刷题交流QQ群:444172041

注:本文当时参考的labuladong的算法小抄的相关思路,代码实现为独立写的C代码。本篇解法参考了labuladong的C++滑窗模板,并根据C代码实现做了部分调整,相关改变见注释。

Git项目地址:LeetCodeUsingC刷题笔记

实现代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#define MAX_LEN 128 // 可改为26个小写字母
#define MAX_SIZE 20100
int* findAnagrams(char * s, char * t, int* returnSize)
{
    if (s == NULL) return NULL;
    int hashNeed[MAX_LEN] = {0};
    int hashWindow[MAX_LEN] = {0};
    int start = 0;
    int end = 0;
    int minStart = 0;
    int minLen = INT_MAX;
    int lenS = strlen(s);
    int i, lenT = 0;
    int valid = 0;
    int keyNum = 0;

    int *resArray = (int*)malloc(MAX_SIZE * sizeof(int));
    if (resArray == NULL) return NULL;
    int returnNum = 0;

    for (i = 0; t[i]; i++) {
        hashNeed[t[i]]++;
    }
    lenT = i;  // 原表达长度
    for (i = 0; i < MAX_LEN; i++) {
        if (hashNeed[i] != 0) { keyNum++; } // 改成表达键元素个数
    }

    // 记录最小覆盖子串的起始索引及长度
    while (end < lenS) {
        // c 是将移入窗口的字符
        char c = s[end];
        // 右移窗口
        end++;
        // 进行窗口内数据的一系列更新
        if (hashNeed[c]) { // count函数是查找该值是否存在
            hashWindow[c]++;
            if (hashWindow[c] == hashNeed[c]) // 原代码
                valid++;
        }

        // 判断左侧窗口是否要收缩
        while (end - start >= lenT) {       // 当前窗长大于t的长度时,就要左移left,因为窗长是固定的lenT
            // 在这里更新最小覆盖子串
            if (valid == keyNum) { // 键的个数
                 // 含有匹配的字符串
                 resArray[returnNum++] = start;
            }
            // d 是将移出窗口的字符
            char d = s[start];
            // 左移窗口
            start++;
            // 进行窗口内数据的一系列更新
            if (hashNeed[d]) {
                if (hashWindow[d] == hashNeed[d])
                    valid--; // 匹配数减1
                hashWindow[d]--; // 当前窗内含有的键值更新
            }
        }
    }

    // 遍历完返回索引数组和个数
    *returnSize = returnNum;
    return resArray;
}

你可能感兴趣的:(LeetCode刷题,字符串,滑动窗口,leetcode,c语言)