字符串能否由子串循环得到(substring,replaceAll)-java

版权声明:哼!坏人!这是我辛辛苦苦码的! https://blog.csdn.net/DurianPudding/article/details/89135907

题目

给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。输出满足条件的最长子串,否则输出false。
例如,“abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,则输出"abc”,而"abcab"则不满足条件,则输出 “false”。

思路

子串最长不过是字符串的一半,每次使用substring()截取子串,循环去掉末位,用replaceAll()和正则表达式判断子串是否可以循环得到字符串。

知识点

  1. public String substring(int beginIndex, int endIndex):返回字符串的子字符串。第二个参数可选,两个参数分别表示起始位和末位。
  2. 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);
 
    }
 
}

猜你喜欢

转载自blog.csdn.net/DurianPudding/article/details/89135907