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;
	}

}
相关推荐
zhurui_xiaozhuzaizai3 分钟前
模型训练-关于token【低概率token, 高熵token】
人工智能·算法·自然语言处理
ThreeYear_s10 分钟前
基于FPGA的PID算法学习———实现PID比例控制算法
学习·算法·fpga开发
卫生纸不够用1 小时前
(三)Linux性能优化-CPU-CPU 使用率
linux·运维·服务器
子豪-中国机器人1 小时前
C++ 信息学奥赛总复习题答案解析
开发语言·c++·算法
弥彦_1 小时前
牛客round95D
c++·算法
强盛小灵通专卖员2 小时前
基于深度学习RT-DETR算法的盲人障碍物目标检测:提升盲人出行安全的智能化突破
深度学习·算法·目标检测·计算机视觉·rt-detr·小论文·计算机期刊
Clownseven2 小时前
Ubuntu 24.04 LTS 长期支持版发布:对服务器用户意味着什么?新特性、升级建议与性能影响初探
linux·服务器·ubuntu
Xam_d_LM2 小时前
【Linux】服务器反向代理自动续签免费 Let‘s Encrypt 证书报错解决方法
linux·运维·服务器·反向代理·lets encrypt·http-01·证书续签
有时有晌2 小时前
linux arm系统烧录
linux·运维·arm开发
阳洞洞3 小时前
376. Wiggle Subsequence
leetcode·贪心