解题思路

为了找到两个字符串的最长公共子串,我们可以使用暴力匹配的方法。具体步骤如下:

  1. 暴力匹配

    • 对于每一对字符位置 (i, j),从 s1s2 的当前位置开始,逐个比较字符,直到不相等为止。
  2. 记录最大长度

    • 在每次匹配过程中,记录当前匹配的长度,并更新最大长度。
  3. 返回结果

    • 最后返回记录的最大公共子串长度。

代码

#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))  # 输出最长公共子串的长度

算法及复杂度

  • 算法:暴力匹配
  • 时间复杂度:,其中 分别是两个字符串的长度
  • 空间复杂度:,只使用了常数级的额外空间