Leetcode 459:重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

复制代码
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

复制代码
输入: s = "aba"
输出: false

示例 3:

复制代码
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

解题思路:

1.如果s存在重复字串,则将t掐头去尾以后,一定还存在一个s;

2.先去掉t的首尾字符(下标从1开始,到length-2结束);

3.找t中是否存在一个s。

java 复制代码
public class title459 {

	public static void main(String[] args) {
		
		String s="ababab";
		boolean result = repeatedSubstringPattern(s);
		System.out.println(result);
		
	}
	
	
	public static boolean repeatedSubstringPattern(String s) {

		String t=s+s;
		int j=0;
		int[] next=getNext(s);
		for(int i=1;i<t.length()-1;i++) {
			while(j>0&& t.charAt(i)!=s.charAt(j)) {
				j=next[j-1];
			}
			if(t.charAt(i)==s.charAt(j)) {
				j++;
			}
			if(j==s.length()){
				return true;
			}
		}
		return false;
    }
	
	//求next数组
	public static int[] getNext(String s) {
		int[] next = new int[s.length()];
		int j=0;
		next[0]=0;
		for(int i=1;i<s.length();i++) {
			while(j>0 && s.charAt(i)!=s.charAt(j)) {
				j=next[j-1];
				
			}
			if(s.charAt(i)==s.charAt(j)) {
				j++;
			}
			next[i]=j;
		}
		return next;
	}

}
相关推荐
小刘不想改BUG8 分钟前
LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)
linux·算法·leetcode
灵典33614 分钟前
数据结构入门-二叉树的层序遍历
数据结构·算法
范纹杉想快点毕业18 分钟前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
补三补四20 分钟前
随机森林(Random Forest)
人工智能·科技·算法·随机森林·机器学习
轮到我狗叫了23 分钟前
力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙编辑力扣300.最长递增子序列
java·数据结构·算法
赵青临的辉43 分钟前
常见机器学习算法简介:回归、分类与聚类
算法·机器学习·回归
程序员莫小特44 分钟前
【GESP真题解析】第 20 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
c语言·数据结构·c++·算法·青少年编程·矩阵
weixin_387002151 小时前
使用GmSSL v3.1.1实现SM2证书认证
算法·安全·区块链·密码学·ssl
s_little_monster1 小时前
【Linux】socket网络编程基础
linux·运维·网络·笔记·学习·php·学习方法
啥都鼓捣的小yao1 小时前
课程11. 计算机视觉、自编码器和生成对抗网络 (GAN)
人工智能·python·深度学习·神经网络·算法·生成对抗网络·计算机视觉