定义重复字符串是由两个相同的字符串首尾拼接而成。例如:"abcabc" 是一个长度为 6 的重复字符串,因为它由两个 "abc" 串拼接而成;"abcba" 不是重复字符串,因为它不能由两个相同的字符串拼接而成。
给定一个字符串,请返回其最长重复子串的长度。
若不存在任何重复字符子串,则返回 0。
本题中子串的定义是字符串中一段连续的区间。
数据范围:字符串长度不大于
,保证字符串一定由小写字母构成。
进阶:空间复杂度
,时间复杂度
"ababc"
4
abab为最长的重复字符子串,长度为4
"abcab"
0
该字符串没有重复字符子串
import java.util.*;
public class Solution {
public int solve (String a) {
int n = a.length();
int temp = 0;
for (int len = n / 2; len >= 1; len--) {
for (int startIndex = 0; startIndex < n - len; startIndex++) {
if (a.charAt(startIndex) == a.charAt(startIndex + len)) {
temp++;
} else {
temp = 0;
}
if (temp == len) {
return len * 2;
}
}
}
return 0;
}
} public int solve (String a) {
// write code here
int len=a.length() ,mid=len/2;
while(mid>0){ // 按最大长度递减
for(int i=0;i+mid*2<=len;i++){ // 卡mid长度的两个字符串进行比较,找到即返回
if(a.substring(i,i+mid).equals(a.substring(i+mid,i+mid*2))){
return mid*2;
}
}
mid--;
}
return 0;
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a string字符串 待计算字符串
* @return int整型
*/
public int solve (String str) {
// write code here
//思路:使用字符串截取来匹配
int len=str.length();
//直接来最大长度匹配,不匹配就依次减少长度
int size=len-1;
while(size>=0){
for(int i=0;i<len-size;i++){
//如果从截取位置开始,后面的字符串包含截取的字符串并且是相邻的就是最大的
if(str.substring(i+size).contains(str.substring(i,i+size))&&str.substring(i+size).length()>=size&&str.substring(i+size,i+size*2).contains(str.substring(i,i+size))){
return size*2;
}
}
size--;
}
return 0;
}
} public int solve (String a) {
// write code here
if (a == null || a.length() < 2) {
return 0;
}
//next数组
int[] next = getNext(a);
int max = 0;
for (int i = 1; i < a.length(); i += 2) {
if ((i + 1) / 2 <= next[i]) {
max = Math.max(max, i + 1);
}
}
return max;
} 但是不对。。。import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a string字符串 待计算字符串
* @return int整型
*/
public int solve (String a) {
// write code here
int maxLen = 0;
for(int i = 0; i < a.length(); i++){
for(int j = i + 2; j < a.length() + 1; j+=2){ // 求字串的时候字串长度依次加2 因为重复的一定是偶数长度
StringBuilder sb = new StringBuilder(a.substring(i,j));
int halfIndex = sb.length() / 2;
if(sb.substring(0,halfIndex).equals(sb.substring(halfIndex,sb.length())) && sb.length() > maxLen){
maxLen = sb.length();
}
}
}
return maxLen;
}
} // 六刷
//可以将两个字符串想像成两个连续的滑动窗口,并假设这个滑动窗口最大是字符串长度的一半,
// 通过比较两个窗口的内容是否相同,不相同的时候不断从左向右平移,完了之后,还是不相同,
// 这时候就将窗口的大小调小一点,直到找到一个相同的,这个时候窗口的长度×2就是最大字符串的大小
import java.util.*;
public class Solution {
public int solve (String a) {
// write code here
if (a == null || a.length() <= 1) return 0;
char[] chars = a.toCharArray();
int len = chars.length;
int maxLen = chars.length / 2;
for (int i = maxLen; i >= 1;i--){
for (int j = 0; j < len - 2 * i;j++){
if (check(chars, j, i))
return 2 * i;
}
}
return 0;
}
public boolean check(char[] chars, int start, int len){
for (int i = start;i < start + len;i++){
if (chars[i] != chars[i +len])
return false;
}
return true;
}
} public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a string字符串 待计算字符串
* @return int整型
*/
public boolean subStringCompare(String a, int before1, int before2, int strlen){
for(int i=0;i<strlen;i++){
if(a.charAt(before1+i) != a.charAt(before2+i))
return false;
}
return true;
}
public int solve (String a) {
// write code here
int ans = 0;
int[]chCount = new int[26];
int[]ptr = new int[26];
int[][]showIndex = new int[26][];
for(int i=0;i<a.length();i++)
chCount[a.charAt(i)-'a']++;
for(int i=0;i<a.length();i++){
if(ptr[a.charAt(i)-'a'] == 0){
showIndex[a.charAt(i) - 'a'] = new int[chCount[a.charAt(i)- 'a']];
}
showIndex[a.charAt(i)-'a'][ptr[a.charAt(i)-'a']] = i;
ptr[a.charAt(i)-'a']++;
}
for(int i=0;i<a.length();i++){
char ch = a.charAt(i);
for(int j=0;j<showIndex[ch-'a'].length;j++){
int beforeIndex = showIndex[ch-'a'][j];
int strlen = i-beforeIndex;
if(beforeIndex>=i || strlen*2<ans)
break;
if(beforeIndex+1-strlen<0)
continue;
if(subStringCompare(a, beforeIndex+1, beforeIndex+1-strlen, strlen)){
ans = strlen*2;
}
}
}
return ans;
}
} public int solve (String a) {
int n = a.length();
int max = 0;
for (int i = 0; i < n; i++) {
for (int len = 1; len <= n/2; len++) {
if(i + 2*len -1 >= n){
break;
}
int l = 0;
while(l < len){
if(a.charAt(i+l) == a.charAt(i+len+l)){
l++;
max = Math.max(max, l);
}else{
break;
}
}
}
}
return 2*max;
} public int solve (String a) {
//计算以i和j开头的字串所能到达的最长重复字串
int n=a.length();
for(int l=n/2;l>0;l--){//一段重复字串的长度
Loop:for(int i=0;i+2*l<=n;i++){//第一段起始位置
for(int j=i;j<i+l;j++){//相当于手动写了substring(i,i+l)和substring(i+l,i+2*l)
if(a.charAt(j)!=a.charAt(j+l))//只要这段子串中有一个字符不匹配,以i开头且长度为l的就不是重复子串
continue Loop;
}
return l*2;//先匹配的就是最长的
}
}
return 0;
}