兩個字符串的最長公共子串

import java.util.Scanner;
/* 求兩個字符串的最長公共子串*/
public class stringDemo {
    public static void main(String[] args){
    	Scanner scanner = new Scanner(System.in);
    	System.out.println("請輸入第一個字符串:");
    	String str1 = scanner.nextLine();
    	System.out.println("請輸入第二個字符串:");       
        String str2 = scanner.nextLine();
        System.out.println("最大公共子串爲"+commonMaxSubstring(str1, str2));
    }
    public static String commonMaxSubstring(String str1,String str2){
        //最大公共子串的長度不會超過兩個字串中最短的那個字串的長度
        int len = str1.length()<str2.length()?str1.length():str2.length();
        String str3 = null;//str3保存最大公共子串
        outer:
            //i爲最長公共子串的長度(從最長依次遞減)
            for(int i = len;i>0;i--){
                //j爲子串的腳標
                for(int j=0;j<len-i+1;j++){
                    str3=str1.substring(j,j+i);//子串的長度爲(j+i)-j=i
                    if(str2.contains(str3))
                        break outer;
                }
            }
        return str3;
    }
}

測試結果:

wKiom1SFwpfy3j1dAADIWJmBqXQ246.jpg

本題涉及3個知識點

1、public String substring(int beginindex,int endindex)返回一個新字符串,它是此字符串的一個子字符串。該子字符串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字符。因此,該子字符串的長度爲 endIndex-beginIndex

明白該方法就能很好的理解第20條語句

2、contains()方法返回true,當且僅當此字符串包含指定的char值序列;

3、outer外層嵌套循環,用break outer可退出外層循環


通常求最大公共子串會涉及到動態規劃算法,有興趣可研究下面博友dongdong200514的blog:

最長公共子串——動態規劃


j_0003.gif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章