1. 程式人生 > >判斷非空字串是否由子串首尾拼接

判斷非空字串是否由子串首尾拼接

如輸入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 ""; //若父串不是由子串重複拼接而成,則返回空字串 } } } }