题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop abcsafjklmnopqrstuvw
输出
jklmnop
代码如下:
1 package com.yzh.hehe; 2 3 import java.util.Scanner; 4 5 public class LongestSubStrBetweenAB { 6 7 public static void main(String[] args) { 8 Scanner scanner=new Scanner(System.in); 9 while (scanner.hasNext()) { 10 String a=scanner.nextLine(); 11 String b=scanner.nextLine(); 12 System.out.println(longestSubBetweenAB2(a, b)); 13 } 14 scanner.close(); 15 16 } 17 18 private static String longestSubBetweenAB(String a, String b) { 19 int alength=a.length(); 20 int blength=b.length(); 21 //保证a串为较短串 22 if (alength>blength) { 23 String temp=a; 24 int tempLength=alength; 25 alength=blength; 26 blength=tempLength; 27 a=b; 28 b=temp; 29 } 30 //从较短串整串开始,长度依次递减从左向右得到较短串子串,如果较长串中包含此子串,即为目标子串 31 for (int i=alength; i> 0; i--) { 32 int count=alength-i+1; 33 for (int j = 0; j < count; j++) { 34 if (b.contains(a.substring(j, j+i))) { 35 return a.substring(j,j+i); 36 } 37 } 38 } 39 return null; 40 } 41 42 // 动态规划解决最长子串问题 43 private static String longestSubBetweenAB2(String a,String b) { 44 int alength=a.length(); 45 int blength=b.length(); 46 //保证a串为较短串 47 if (alength>blength) { 48 String temp=a; 49 int tempLength=alength; 50 alength=blength; 51 blength=tempLength; 52 a=b; 53 b=temp; 54 } 55 int[][]arr=new int[alength+1][blength+1]; 56 String[][] sArr=new String[alength+1][blength+1]; 57 StringBuilder stringBuilder=new StringBuilder(); 58 String resultString=null; 59 int result=0; 60 for (int i = 0; i <= alength; i++) { 61 for (int j = 0; j <= blength; j++) { 62 if (i==0||j==0) { 63 arr[i][j]=0; 64 sArr[i][j]=""; 65 }else if (a.charAt(i-1)==b.charAt(j-1)) { 66 arr[i][j]=arr[i-1][j-1]+1; 67 // stringBuilder.append(b.charAt(j-1)); 68 sArr[i][j]=sArr[i-1][j-1]+a.charAt(i-1); 69 if (arr[i][j]>result) { 70 result=arr[i][j]; 71 resultString=sArr[i][j]; 72 } 73 74 }else { 75 arr[i][j]=0; 76 sArr[i][j]=""; 77 // stringBuilder.delete(0, stringBuilder.length()); 78 } 79 } 80 } 81 if (resultString.length()==0) { 82 return null; 83 } 84 return resultString; 85 86 } 87 }
浙公网安备 33010602011771号