天地无极,乾坤剑法

导航

 

题目描述

查找两个字符串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 }

 

posted on 2018-02-24 00:18  天地无极,乾坤剑法  阅读(152)  评论(0)    收藏  举报