news 2026/10/8 7:10:50

C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串

问题描述

小明在玩一个字符串拼接游戏时发现了一个有趣的现象:某些字符串可以通过重复一个较短的子串多次来构成。比如字符串 "abcabcabc" 可以由子串 "abc" 重复3次得到。这个较短的子串被称为字符串的"循环节"或"基础重复单元"。

现在小明想请你帮忙设计一个算法,给定一个非空字符串 s,找出能够通过重复构成整个字符串 s 的最短基础子串(即最短循环节)。如果存在多个这样的子串,返回任意一个即可。如果字符串无法由任何子串(除了整个字符串本身)重复构成,则返回整个字符串。

要求:

  1. 设计一个高效的算法来找到最短循环子串。
  2. 注意处理字符串可能无法由子串循环构成的情况(此时返回整个字符串)。

测试样例

样例1:

输入:s = "abcabcabc"输出:"abc"解释:整个字符串长度为9,可以由长度为3的子串"abc"重复3次(3×3=9)构成。

样例2:

输入:s = "aaaa"输出:"a"解释:整个字符串长度为4,可以由长度为1的子串"a"重复4次(1×4=4)构成。

样例3:

输入:s = "ababab"输出:"ab"解释:整个字符串长度为6,可以由长度为2的子串"ab"重复3次(2×3=6)构成。

样例4:

输入:s = "abcde"输出:"abcde"解释:整个字符串长度为5,无法由任何更短的子串重复构成(因为5是质数),因此返回整个字符串。

约束条件

  • 1 ≤ s.length ≤ 1000
  • s 仅由小写英文字母组成
  • 保证输入的字符串 s 非空

程序代码

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

char* shortestRepeatingSubstring(char* s) {

int n = strlen(s);

// 枚举循环节长度

for (int len = 1; len <= n; len++) {

// 长度必须能整除 n

if (n % len != 0) continue;

// 验证 s 是否由长度为 len 的前缀重复构成

int valid = 1;

for (int i = len; i < n; i++) {

if (s[i] != s[i % len]) {

valid = 0;

break;

}

}

if (valid) {

// 找到最短循环节,返回前 len 个字符

char* result = (char*)malloc((len + 1) * sizeof(char));

strncpy(result, s, len);

result[len] = '\0';

return result;

}

}

// 理论上不会到这里(因为 len=n 总是有效的)

char* result = (char*)malloc((n + 1) * sizeof(char));

strcpy(result, s);

return result;

}

int main() {

char* r1 = shortestRepeatingSubstring("abcabcabc");

char* r2 = shortestRepeatingSubstring("aaaa");

char* r3 = shortestRepeatingSubstring("ababab");

char* r4 = shortestRepeatingSubstring("abcde");

printf("%s\n", r1); // abc

printf("%s\n", r2); // a

printf("%s\n", r3); // ab

printf("%s\n", r4); // abcde

free(r1);

free(r2);

free(r3);

free(r4);

return 0;

}

#include <stdio.h> #include <string.h> #include <stdlib.h> char* shortestRepeatingSubstring(char* s) { int n = strlen(s); // 枚举循环节长度 for (int len = 1; len <= n; len++) { // 长度必须能整除 n if (n % len != 0) continue; // 验证 s 是否由长度为 len 的前缀重复构成 int valid = 1; for (int i = len; i < n; i++) { if (s[i] != s[i % len]) { valid = 0; break; } } if (valid) { // 找到最短循环节,返回前 len 个字符 char* result = (char*)malloc((len + 1) * sizeof(char)); strncpy(result, s, len); result[len] = '\0'; return result; } } // 理论上不会到这里(因为 len=n 总是有效的) char* result = (char*)malloc((n + 1) * sizeof(char)); strcpy(result, s); return result; } int main() { char* r1 = shortestRepeatingSubstring("abcabcabc"); char* r2 = shortestRepeatingSubstring("aaaa"); char* r3 = shortestRepeatingSubstring("ababab"); char* r4 = shortestRepeatingSubstring("abcde"); printf("%s\n", r1); // abc printf("%s\n", r2); // a printf("%s\n", r3); // ab printf("%s\n", r4); // abcde free(r1); free(r2); free(r3); free(r4); return 0; }

运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 7:10:49

AI应用底座工程实践:基于Spring Cloud的微服务架构与流式响应治理

1. 从一次深夜救火说起&#xff1a;为什么“AI 应用底座”突然成了刚需去年冬天&#xff0c;一个做智能客服的朋友凌晨两点给我打电话&#xff0c;说他们的系统崩了。不是模型崩了&#xff0c;是模型前面那层“壳”崩了。用户请求进来&#xff0c;网关限流没配好&#xff0c;直…

作者头像 李华
网站建设 2026/10/8 7:10:02

世界第一款动态语言文档

文档&#xff0c;从此会动&#xff1a;用 UniDoc 写一份「能运行」的文档 图表会随数据重新计算&#xff0c;滑块拖一下结果就变&#xff0c;网页和小游戏能直接嵌进正文。UniDoc 让一份文档不再只是一页纸。 我们每天打开的文档&#xff0c;大多是静止的。报告里的图表是一张截…

作者头像 李华
网站建设 2026/10/8 7:09:38

Mac 免费打开 Word/Excel/Markdown/CSV:9MB 文档查看器 AhaTxt 完整上手

前言&#xff1a;Mac 上「看一眼」别人发来的文档&#xff0c;是最常见的场景&#xff0c;却最折腾——Office 装完好几个 G、启动半分钟&#xff1b;Markdown 双击是满屏 # 号&#xff1b;CSV 打开是一坨逗号&#xff1b;drawio 图不装原软件直接看不到。 本文介绍一个免费的 …

作者头像 李华
网站建设 2026/10/8 7:09:19

Nomad部署ClickHouse实战:HCL配置、Flink管道与优雅停止故障排查

最近把一套用户行为分析用的 ClickHouse 从手工脚本挪到了 Nomad 上&#xff0c;顺带把给 ClickHouse 供数的实时任务也一起收编进 Job 体系。这个项目在内部就叫“Nomad 组件部署 clickhouse-job”&#xff0c;听起来很绕&#xff0c;拆开其实就三件事&#xff1a;ClickHouse …

作者头像 李华
网站建设 2026/10/8 7:08:54

工业级电源路径保护:TPS259483AYWPR+MK64FN1M0VDC12硬核协同方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华