题目描述
小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。
重复代码查找方法:以字符串形式给定两行代码(字符串长度 1 < length <= 100,由英文字母、数字和空格组成),找出两行代码中的最长公共子串。
注:如果不存在公共子串,返回空字符串
输入描述
输入的参数text1, text2分别表示两行代码
输出描述
输出任一最长公共子串
示例:
输入 | hello123world hello123abc4 |
---|---|
输出 | hello123 |
说明 | 无 |
输入 | hiworld hiweb |
---|---|
输出 | hiw |
说明 | 无 |
Python算法源码
def get_result(str1, str2):
n = len(str1)
m = len(str2)
dp = [[0] * (m + 1) for _ in range(n + 1)]
max_length = 0
ans = ""
for i in range(1, n + 1):
for j in range(1, m + 1):
if str1[i - 1] == str2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
if dp[i][j] > max_length:
max_length = dp[i][j]
ans = str1[i - max_length:i]
else:
dp[i][j] = 0
return ans
if __name__ == "__main__":
# 输入两个字符串
str1 = input()
str2 = input()
print(get_result(str1, str2))
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
System.out.println(getResult(str1, str2));
}
public static String getResult(String str1, String str2) {
int n = str1.length();
int m = str2.length();
int[][] dp = new int[n + 1][m + 1];
int max = 0;
String ans = "";
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > max) {
max = dp[i][j];
ans = str1.substring(i - max, i);
}
} else {
dp[i][j] = 0;
}
}
}
return ans;
}
}
1 条评论
[...]面试算法题LeetCode原题简单序列题目编号频次1605. 种花问题 - 力扣(LeetCode)12125. 验证回文串 - 力扣(LeetCode)131961. 检查字符串是否为数组前缀 - 力扣(LeetCode)14504. 七进制数 - 力扣(LeetCode)15344. 反转字符串 - 力扣(LeetCode)161184. 公交站间的距离 - 力扣(LeetCode)17594[...]