字符串最小周期

本文介绍了如何计算一个字符串的最小周期,首先通过暴力求解的方式,然后提出利用KMP算法中的next数组优化解法,将时间复杂度降至O(n),并给出了C++实现代码。
摘要由CSDN通过智能技术生成

1. 问题描述

给定一个长度为n的字符串S,如果存在一个字符串T,重复若干次T能够得到S,那么,S叫做周期串,T叫做S

的一个周期。如:字符串abababab是周期串,abab、ab都是它的周期,其中,ab是它的最小周期。设计一个算法,

计算S的最小周期。


2. 问题分析

首先我们会很容易想到最简单的暴力求解:假设字符串S的长度为 len,S的最小周期的长度为 i ,字符串S表示

为S[0…len-1]。

我们遍历 i 从1到 len/2 (只需要遍历到 len/2 即可,因为最小周期的长度不可能超过字符串S长度的一半),若len % 

i == 0,i 便有可能是最小周期的长度,具体是不是还需要进行判断。

判断 i 是不是最小周期的长度,要将字符串S后面的 len – i 个字符中每 i 个字符分成的各组字符分别与前 i 个字符

进行比较,即将 S[i…2i-1],S[2i…3i-1],……,S[len-i…len-1] 各个分组的每个字符分别与 S[0…i-1] 中的每个字符进

行比较。更简洁一点,省去分组的麻烦,直接将 S[i…len-1] 的每个字符 S[j] (j = i,…,len-1) 分别与 S[j % i] 进行比较即

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值