Leecode刷题C语言之同位字符串连接的最小长度

执行结果:通过

执行用时和内存消耗如下:

复制代码
bool check(char *s, int m) {
    int n = strlen(s), count0[26] = {0};
    for (int j = 0; j < n; j += m) {
        int count1[26] = {0};
        for (int k = j; k < j + m; k++) {
            count1[s[k] - 'a']++;
        }
        if (j > 0 && memcmp(count0, count1, sizeof(int) * 26) != 0) {
            return false;
        }
        memcpy(count0, count1, sizeof(int) * 26);
    }
    return true;
}

int minAnagramLength(char *s) {
    int n = strlen(s);
    for (int i = 1; i < n; i++) {
        if (n % i != 0) {
            continue;
        }
        if(check(s, i)) {
            return i;
        }
    }
    return n;
}

解题思路:

这段代码的主要目的是找到一个字符串 s 的最小回文子串长度,使得该字符串可以被划分成若干个完全相同的子串,并且这些子串都是彼此的字母异位词(即它们包含相同数量的每个字符)。不过,从代码实现来看,实际上它寻找的是字符串 s 可以被均匀划分成相同字母异位词子串的最小长度。如果找不到这样的划分,则返回整个字符串的长度。下面详细解释这段代码的思路:

check 函数

check 函数用于检查一个字符串 s 是否可以均匀划分成长度为 m 的子串,并且这些子串都是彼此的字母异位词。

  1. 参数 :
    • char *s:输入的字符串。
    • int m:要检查的子串长度。
  2. 步骤 :
    • 计算字符串 s 的长度 n。
    • 初始化一个数组 count0 用于存储上一个长度为 m 的子串的字符频率。
    • 遍历字符串 s,每次跳跃 m 个字符作为新的子串的开始位置。
    • 对于每个子串,使用另一个数组 count1 来记录当前子串的字符频率。
    • 如果当前子串不是第一个子串(即 j > 0),则比较 count0 和 count1:
      • 如果它们不相同,说明不是所有长度为 m 的子串都是彼此的字母异位词,返回 false。
    • 使用 memcpy 将 count1 的内容复制到 count0,为下一个子串的比较做准备。
    • 如果所有子串都通过了检查,则返回 true。

minAnagramLength 函数

minAnagramLength 函数用于找到字符串 s 可以被均匀划分成相同字母异位词子串的最小长度。

  1. 参数 :
    • char *s:输入的字符串。
  2. 步骤 :
    • 计算字符串 s 的长度 n。
    • 遍历从 1 到 n-1 的所有可能的子串长度 i。
    • 如果 n 不能被 i 整除,则跳过当前长度(因为无法均匀划分)。
    • 使用 check 函数检查长度为 i 的子串是否满足条件(即所有长度为 i 的子串都是彼此的字母异位词)。
    • 如果找到满足条件的子串长度,立即返回该长度。
    • 如果遍历完所有可能的长度都没有找到满足条件的子串,则返回整个字符串的长度 n(作为最坏情况,整个字符串本身就是一个无法再划分的"子串")。

总结

这段代码通过检查字符串 s 是否可以被均匀划分成长度为 m 的子串,并且这些子串都是彼此的字母异位词,来找到最小的这样的 m。如果找不到这样的 m,则返回整个字符串的长度。这可以用于判断字符串是否具有某种特定的均匀性和字符频率特性

相关推荐
程序 代码狂人1 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade2 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Zwawa3 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
c语言·嵌入式·编译器
学逆向的3 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
水饺编程4 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编
小郎君6584 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一4 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS1005 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao5 小时前
算法56,重排链表
数据结构·算法·链表