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; } }
測試結果:
本題涉及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: