题目描述
求两个字符串的最长公共子串,
如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的)。
分析
方法1
如果两个字符串的长度不同,则最长公共子串的长度不会超过短字符串的长度。
主要思想:
假设
- LongerOne:长一些的字符串;
- ShorterOne:短一些的字符串;
- ShorterLen:记录短一些的字符串长度;
- subStr:ShorterOne的一个子串,即shorterOne.substring(begin, end)
subStr的长度 len=end-begin ,按照len从大到小的顺序从前向后依次检查subStr是否是LongerOne的子串,如果是则返回该子串,程序结束,否则返回null。
方法2
使用
- 字符数组curLine记录str2中的当前字符的与str1的匹配情况;
- 字符数组lastLine保存str2中的前一个字符的与str1的匹配情况;
- 整数maxLen记录最长公共子串的长度;
- 整数idx记录最长公共子串的最后一个字符在str1中的下标。
设 n n n = curLine[i] ,该数值表示与其对应的str1.charAt(i)及str1的前面 ( n − 1 ) (n-1) (n−1)个(lastLine[i-1])字符和str2相同。
示例:
Java代码
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in)