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,则返回整个字符串的长度。这可以用于判断字符串是否具有某种特定的均匀性和字符频率特性

相关推荐
huang57914719 分钟前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_41 分钟前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
白色的北极熊1 小时前
c语言 scanf 输入流有空格,逗号 说明
c语言
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Elsa️7461 小时前
算法一周刷题总结
c++·算法
小小程序猴11 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途2 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
彧azz2 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
宣宣猪的小花园.2 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习
青山木3 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划