版权声明:哼!坏人!这是我辛辛苦苦码的! https://blog.csdn.net/DurianPudding/article/details/89135907
题目
给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。输出满足条件的最长子串,否则输出false。
例如,“abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,则输出"abc”,而"abcab"则不满足条件,则输出 “false”。
思路
子串最长不过是字符串的一半,每次使用substring()
截取子串,循环去掉末位,用replaceAll()
和正则表达式判断子串是否可以循环得到字符串。
知识点
public String substring(int beginIndex, int endIndex)
:返回字符串的子字符串。第二个参数可选,两个参数分别表示起始位和末位。public String replaceAll(String regex, String replacement)
:使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。第一个参数表示匹配此字符串的正则表达式。第二个参数表示用来替换每个匹配项的字符串。成功则返回替换的字符串,失败则返回原始字符串。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine(); // 这里只给一个字符串,所以不需要用while循环接收字符串。
// 如果需要使用while,则注意:采用has xxxx的话,后面也要用next xxxx。比如前面用hasNextLine,那么后面要用 nextLine 来处理输入。
int i = str.length() / 2; // 最长也不过是原字符串长度的一半
for(; i >= 0; i--) {
String sub = str.substring(0,i); // 每次截取前i个字符串
if(str.replaceAll(sub,"").length() == 0) { // 利用正则表达式,替换原字符串的内容,如果最后为空,说明可以被完全替换,所以是最长字串
System.out.println(sub);
return;
}
}
System.out.println(false);
}
}