题目描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
String str1 = scanner.next();
String str2 = scanner.next();
String res = "";
if (str1.length() <= str2.length())
res = findMax(str1, str2);
else
res = findMax(str2, str1);
System.out.println(res);
}
}
public static String findMax(String str1, String str2)
{
if (str2.contains(str1))
return str1;
int len = str1.length();
while (len >= 1)
{
for (int i = 0; i + len <= str1.length(); i++)
{
String sub = str1.substring(i, i + len);
if (str2.contains(sub))
return sub;
}
len--;
}
return "";
}
}
动态规划:
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
String s1 = scanner.next();
String s2 = scanner.next();
getCommenStr(s1, s2);
}
}
public static void getCommenStr(String s1, String s2)
{
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int[][] dp = new int[c1.length + 1][c2.length + 1];
int max = 0;
int num = 0;
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= c1.length; i++)
{
for (int j = 1; j <= c2.length; j++)
{
if (c1[i - 1] == c2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
}
}
if (c1.length < c2.length)
{
for (int i = 0; i < c1.length; i++)
{
for (int j = 0; j < c2.length; j++)
{
if (dp[i][j] > max)
{
max = dp[i][j];
num = i;
}
}
}
}
else
{
for (int i = 0; i < c2.length; i++)
{
for (int j = 0; j < c1.length; j++)
{
if (dp[j][i] > max)
{
max = dp[j][i];
num = j;
}
}
}
}
for (int i = num - max; i < num; i++)
sb.append(c1[i]);
System.out.println(sb.toString());
}
}