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

}
相关推荐
简朴-ocean19 分钟前
如何删除linux空的文件夹
linux·运维·服务器
Code Warrior1 小时前
【Linux】Linux基础指令3
linux·服务器
jndingxin1 小时前
OpenCV CUDA模块光流计算-----实现Farneback光流算法的类cv::cuda::FarnebackOpticalFlow
人工智能·opencv·算法
南朝雨1 小时前
linux下安装elasticsearch及ik分词器
linux·elasticsearch·全文检索
leblancAndSherry1 小时前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins
编程绿豆侠1 小时前
力扣HOT100之栈:394. 字符串解码
java·算法·leetcode
朝朝又沐沐1 小时前
基于算法竞赛的c++编程(18)string类细节问题
开发语言·c++·算法
记得早睡~2 小时前
leetcode73-矩阵置零
数据结构·leetcode·矩阵
半桔2 小时前
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
linux·运维·服务器·面试·centos
爱coding的橙子2 小时前
每日算法刷题Day27 6.9:leetcode二分答案2道题,用时1h20min
算法·leetcode·职场和发展