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

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

http://www.lryc.cn/news/506898.html

相关文章:

  • Pytorch | 利用BIM/I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 音频进阶学习八——傅里叶变换的介绍
  • 将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
  • 使用docker拉取镜像很慢或者总是超时的问题
  • Redis数据库笔记
  • U盘出现USBC乱码文件的全面解析与恢复指南
  • 多线程 - 自旋锁
  • vue2 - Day02 -计算属性(computed)、侦听器(watch)和方法(methods)
  • Linux C 程序 【05】异步写文件
  • Liveweb视频汇聚平台支持WebRTC协议赋能H.265视频流畅传输
  • SQL组合查询
  • 方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现
  • 【机器学习】【集成学习——决策树、随机森林】从零起步:掌握决策树、随机森林与GBDT的机器学习之旅
  • Flink执行模式(批和流)如何选择
  • LeetCode:101. 对称二叉树
  • LDO输入电压不满足最小压差时输出会怎样?
  • 源码分析之Openlayers中ZoomSlider滑块缩放控件
  • 在Win11系统上安装Android Studio
  • 华为ensp--BGP路径选择-AS_Path
  • Android Java Ubuntu系统如何编译出 libopencv_java4.so
  • WPF Binding 绑定
  • 算法笔记—前缀和(动态规划)
  • 将HTML转换为PDF:使用Spire.Doc的详细指南(二)无水印版
  • V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网
  • prober.php探针
  • esp8266_TFTST7735语音识别UI界面虚拟小助手
  • 【CSS in Depth 2 精译_086】14.3:CSS 剪切路径(clip-path)的用法
  • 【服务器】MyBatis是如何在java中使用并进行分页的?
  • vue 文本域 展示的内容格式要和填写时保持一致
  • linux-----进程及基本操作