(字符串)Java 利用 KMP 求解重复的子字符串

文章目录

    • 一、题目
    • 二、KMP 解析
    • 三、代码
    • 四、总结

一、题目

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

(字符串)Java 利用 KMP 求解重复的子字符串_第1张图片

二、KMP 解析

出现字符串,子字符串,所以考虑 KMP(适用于一个串中查找是否出现过另一个串

此处依然可以借助前缀表 next,如果该串可以由子串重复构成

next 数组记录的就是最长相同前后缀

如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)

最长相等前后缀的长度为:next[len - 1] + 1

数组长度为:len

如果 len % (len - (next[len - 1] + 1)) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串

比如:

你可能感兴趣的:(冲刺大厂之,Java,刷题笔记,字符串,算法,leetcode,kmp)