题目描述
小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。
重复代码查找方法:以字符串形式给定两行代码(字符串长度 1 < length <= 100,由英文字母、数字和空格组成),找出两行代码中的最长公共子串。
注:如果不存在公共子串,返回空字符串
输入描述
输入的参数text1, text2分别表示两行代码
输出描述
输出任一最长公共子串
用例
输入 | hello123world hello123abc4 |
输出 | hello123 |
说明 | 无 |
输入 | private_void_method public_void_method |
输出 | _void_method |
说明 | 无 |
输入 | hiworld hiweb |
输出 | hiw |
说明 | 无 |
问题解析
本题要求找到两个字符串中最长的公共子串。如果不存在公共子串,返回空字符串。
解题思路
- 定义一个二维数组
dp
,dp[i][j]
表示字符串text1
的前i
个字符和字符串text2
的前j
个字符所能构成的最长公共子串的长度。 - 初始化数组:将数组
dp
初始化为 0。 - 动态规划填充数组:
- 如果
text1[i-1] == text2[j-1]
,则dp[i][j] = dp[i-1][j-1] + 1
。 - 如果
text1[i-1] != text2[j-1]
,则dp[i][j] = 0
。
- 如果
- 记录最大公共子串的长度和结束位置。
- 通过结束位置和长度提取公共子串。
代码实现
以下是实现该逻辑的 C++ 代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string longest_common_substring(const string &text1, const string &text2) {
int m = text1.length();
int n = text2.length();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
int maxLength = 0;
int endPos = 0;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (text1[i - 1] == text2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > maxLength) {
maxLength = dp[i][j];
endPos = i - 1;
}
}
}
}
if (maxLength == 0) {
return "";
}
return text1.substr(endPos - maxLength + 1, maxLength);
}
int main() {
string text1, text2;
cin >> text1 >> text2;
string result = longest_common_substring(text1, text2);
if (result.empty()) {
cout << "" << endl;
} else {
cout << result << endl;
}
return 0;
}
代码说明
- 函数
longest_common_substring
:- 定义一个二维数组
dp
来记录公共子串的长度。 - 遍历两个字符串,更新
dp
数组。 - 记录最大长度和对应的结束位置。
- 返回最大公共子串。
- 定义一个二维数组
- 主函数:
- 读取输入字符串
text1
和text2
。 - 调用
longest_common_substring
函数,获取结果并输出。
- 读取输入字符串
输入输出示例
- 输入:
hello123world
hello123abc4
- 输出:
hello123
该程序能够根据输入的字符串正确找到并输出最长的公共子串。如果没有公共子串,则输出空字符串。
Python 实现
def longest_common_substring(text1, text2):
m = len(text1)
n = len(text2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
max_length = 0
end_pos = 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if text1[i - 1] == text2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
if dp[i][j] > max_length:
max_length = dp[i][j]
end_pos = i - 1
if max_length == 0:
return ""
return text1[end_pos - max_length + 1:end_pos + 1]
def main():
text1 = input().strip()
text2 = input().strip()
result = longest_common_substring(text1, text2)
if result:
print(result)
else:
print("")
if __name__ == "__main__":
main()
代码说明
- 函数
longest_common_substring
:- 定义一个二维数组
dp
来记录公共子串的长度。 - 遍历两个字符串,更新
dp
数组。 - 记录最大长度和对应的结束位置。
- 返回最大公共子串。
- 定义一个二维数组
- 主函数:
- 读取输入字符串
text1
和text2
。 - 调用
longest_common_substring
函数,获取结果并输出。
- 读取输入字符串
使用示例
运行程序时,将按照下述步骤操作:
- 输入两个字符串
text1
和text2
。 - 程序将输出这两个字符串中最长的公共子串。如果没有公共子串,则输出空字符串。
示例输入:
hello123world
hello123abc4
示例输出:
hello123