题目描述
给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
输入描述:
非空字符串
输出描述:
如果字符串满足上述条件,则输出最长的满足条件的的子串;如果不满足条件,则输出false。
输入例子1:
abcabc
输出例子1:
abc
思路
首先,子串的长度必须能字符串整除,否则不满足拼接;其次,要求输出最长的字串,所以我们需要逆序遍历;然后,因为子串的长度肯定是小于等于字符串长度的一半的,所以我们可以从字符串的中段开始逆序遍历。
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
//读取输入
Scanner in = new Scanner(System.in);
String list = in.next();
int len = list.length();
int end = len >> 1;//从字符转list的中段逆序遍历
for(;end>0;end--){
//子串的长度必须能被原字符串的长度整除
if(len%end == 0){
int i=0;
for(;i<len && list.charAt(i%end) == list.charAt(i);i++){}
//如果成功遍历到最后,说明已经找到了符合条件的字符串
if(i == len) break;
}
}
//end大于0,说明找到了
if(end>0)
System.out.println(list.substring(0,end));
else
//未找到
System.out.println("false");
}
}