判斷非空字串是否由子串首尾拼接
阿新 • • 發佈:2018-11-07
如輸入abcabc,則返回abc,若輸入abcbc,返回false.
大致思路是,從第一個字元開始,到中間的字元,依次生成子串b,呼叫方法,判斷是否在父串a中由首尾拼接而成。判斷輸入的字串a是否為這個字串b的倍數,若不是,直接返回false,若是,迴圈擷取和剛剛找到的字元串同長度的字串b,判斷輸入的字串a是否包含b以及b後面的字串。程式碼如下,目前測試都是對的,若有錯請指出。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("請輸入一個字串");
String n=input.nextLine();
//從第一個字元開始,到中間的字元為止,依次迴圈呼叫方法,判斷是否有符合要求的子串
String str = "";
String chilrdStr = "";
for(int i = 1; i < (n.length() / 2) + 1; i++){
str = isHasChildStr(n, n.substring(0 , i));
if(!str.equals("")){
//若子串存在,則判斷是否是最長的
if(chilrdStr.length() < str.length()){
chilrdStr = str;
}
}
}
if(chilrdStr.equals("")){
System.out.println(n + "不是由子串首尾拼接而成");
}else {
System.out.println("最長的子字串為"+chilrdStr);
}
}
/*
* 判斷父串是否由該子串拼接而成
*/
private static String isHasChildStr(String fatherStr, String childStr){
if(fatherStr.length() % childStr.length()!=0){
return ""; //若父串長度不是子串長度的倍數,返回空字串
}else{
boolean flag = true;
for(int i = 0; i < fatherStr.length(); i = i + childStr.length()){
if(!fatherStr.substring(i,i + childStr.length()).contains(childStr)){
flag=false;
break;
}
}
if(flag){
return childStr; //若父串是由子串重複拼接而成,則返回子串
}else{
return ""; //若父串不是由子串重複拼接而成,則返回空字串
}
}
}
}