题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
示例1
输入:
“1AB2345CD”,“12345EF”
返回值:
“2345”
解题思想:
本题采用动态规划方法解答,我使用的是java语言。首先用StringBuilder创建一个动态字符数组的对象。用来存储公共子串。
在定义子串的起始位置和终止位置,循环条件是终止位置超过了其中一个字符串的长度,先判断字符串2时候包含字符串一的子串,如果包含则再判断是否是最大子串,是,则删除之前字串重新添加,不是则终止位置往后移动一位。直到移动到字符串末尾为止。
下面是展示代码:
public static String LCS (String str1, String str2) {
// write code here
StringBuilder sq1 = new StringBuilder();
int start = 0, end = 1;
while (end < str1.length() + 1) {
if (str2.contains(str1.substring(start, end))) {
//判断是否比之前的子串还长。
if (sq1.length() < end - start) {
//如果大于之前的子串则重新添加
sq1.delete(0, sq1.length());
sq1.append(str1, start, end);
}
end++;
}
else {
start++;
}
}
if (sq1.length() == 0) {
return "-1";
}
return sq1.toString();
}
每个字符串必然包含一个空字符,所以当start=end时字符串一和字符串二必然是包含关系,所以不会出现start>end的情况。