解题思路
为了找到两个字符串的最长公共子串,我们可以使用暴力匹配的方法。具体步骤如下:
-
暴力匹配:
- 对于每一对字符位置
(i, j)
,从s1
和s2
的当前位置开始,逐个比较字符,直到不相等为止。
- 对于每一对字符位置
-
记录最大长度:
- 在每次匹配过程中,记录当前匹配的长度,并更新最大长度。
-
返回结果:
- 最后返回记录的最大公共子串长度。
代码
#include <iostream>
#include <string>
using namespace std;
int longestCommonSubstring(const string& s1, const string& s2) {
int maxLength = 0; // 记录最长公共子串的长度
for (size_t i = 0; i < s1.length(); ++i) {
for (size_t j = 0; j < s2.length(); ++j) { // 对每一对 i 和 j 进行暴力匹配
int currentLength = 0; // 当前匹配的长度
size_t temp1 = i;
size_t temp2 = j;
// 逐个比较字符
while (temp1 < s1.length() && temp2 < s2.length() && s1[temp1] == s2[temp2]) {
currentLength++;
temp1++;
temp2++;
}
// 更新最长公共子串的长度
maxLength = max(maxLength, currentLength);
}
}
return maxLength; // 返回最长公共子串的长度
}
int main() {
string input_str;
getline(cin, input_str); // 读取输入
size_t comma_pos = input_str.find(','); // 查找逗号位置
string str1 = input_str.substr(0, comma_pos); // 获取第一个字符串
string str2 = input_str.substr(comma_pos + 1); // 获取第二个字符串
cout << longestCommonSubstring(str1, str2) << endl; // 输出最长公共子串的长度
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(","); // 读取输入并分割
System.out.println(longestCommonSubstring(s[0], s[1])); // 输出最长公共子串的长度
}
public static int longestCommonSubstring(String s1, String s2) {
int maxLength = 0; // 记录最长公共子串的长度
for (int i = 0; i < s1.length(); ++i) {
for (int j = 0; j < s2.length(); ++j) { // 对每一对 i 和 j 进行暴力匹配
int currentLength = 0; // 当前匹配的长度
int temp1 = i;
int temp2 = j;
// 逐个比较字符
while (temp1 < s1.length() && temp2 < s2.length() && s1.charAt(temp1) == s2.charAt(temp2)) {
currentLength++;
temp1++;
temp2++;
}
// 更新最长公共子串的长度
maxLength = Math.max(maxLength, currentLength);
}
}
return maxLength; // 返回最长公共子串的长度
}
}
def longest_common_substring(s1: str, s2: str) -> int:
max_length = 0 # 记录最长公共子串的长度
for i in range(len(s1)):
for j in range(len(s2)): # 对每一对 i 和 j 进行暴力匹配
current_length = 0 # 当前匹配的长度
temp1, temp2 = i, j
# 逐个比较字符
while temp1 < len(s1) and temp2 < len(s2) and s1[temp1] == s2[temp2]:
current_length += 1
temp1 += 1
temp2 += 1
# 更新最长公共子串的长度
max_length = max(max_length, current_length)
return max_length # 返回最长公共子串的长度
if __name__ == "__main__":
input_str = input() # 读取输入
str1, str2 = input_str.split(",") # 以逗号分隔
print(longest_common_substring(str1, str2)) # 输出最长公共子串的长度
算法及复杂度
- 算法:暴力匹配
- 时间复杂度:,其中 和 分别是两个字符串的长度
- 空间复杂度:,只使用了常数级的额外空间