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),则比较 count0count1
      • 如果它们不相同,说明不是所有长度为 m 的子串都是彼此的字母异位词,返回 false
    • 使用 memcpycount1 的内容复制到 count0,为下一个子串的比较做准备。
    • 如果所有子串都通过了检查,则返回 true

minAnagramLength 函数

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

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

总结

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

相关推荐
spssau16 小时前
非量表问卷信效度分析,用内容效度 + 重测信度评估数据质量
人工智能·算法·机器学习
xieliyu.16 小时前
Java手搓数据结构:从零模拟实现顺序表增删改查
java·开发语言·数据结构·学习·顺序表
我不是懒洋洋16 小时前
【数据结构】二叉树-堆(树的概念、二叉树的概念、顺序结构的结构及实现、堆的实现、堆排序、TopK问题)
c语言·数据结构·c++·经验分享·算法·青少年编程
KobeSacre17 小时前
将有序数组转换为二叉搜索树
数据结构·算法·leetcode
叼烟扛炮17 小时前
【C 语言系统入门教程】第 19 讲:数据在内存中的存储 | 零基础学习笔记
c语言·学习·数据存储·原码反码补码·大小端字节序·浮点数存储
脱氧核糖核酸__17 小时前
LeetCode热题100——160.相交链表(两种解法)
算法·leetcode·链表
碧海银沙音频科技研究院17 小时前
博通BK7258原生语音识别与dump功能功能实现
人工智能·深度学习·算法
handler011 天前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
不爱吃炸鸡柳1 天前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构