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

}
相关推荐
bkspiderx1 天前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
Mr. Cao code1 天前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
抓饼先生1 天前
Linux control group笔记
linux·笔记·bash
挺6的还1 天前
25.线程概念和控制(二)
linux
中华小当家呐1 天前
算法之常见八大排序
数据结构·算法·排序算法
您的通讯录好友1 天前
conda环境导出
linux·windows·conda
沐怡旸1 天前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋1 天前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
代码AC不AC1 天前
【Linux】vim工具篇
linux·vim·工具详解
码农hbk1 天前
Linux signal 图文详解(三)信号处理
linux·信号处理