题解 | #公共子串计算#
公共子串计算
https://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b
// HJ65 查找两个字符串a b 中的公共部分的最长字串.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<iostream> #include<bits/stdc++.h> using namespace std; string a, b;//定义两个全局的字符串ab string cut(int r, int l)//获取截取到的第i-j位的a字符串的内容并返回出去 { string tmp;//定义一个需要放截取字符串的数据类型 for (int i = r; i <= l; i++)//遍历从r到l的长度 { tmp += a[i];//将r到l长度的a串存储到tmp里 } return tmp;//返回截取的字符串 } int main()//main函数 { while (cin >> a >> b)//可以多组输入连续判断,按ctrl+z退出 { string res = "";//建立一个最长的需要输出的字符串,即为重复的最长的字符串 if (a.size() > b.size())swap(a, b);//如果a的长度比b长就交换ab的内容,保证a一直在前面 for (int i = 0; i < a.size(); i++)//遍历a字符串 { for (int j = i; j < a.size(); j++)//遍历a字符串每次加一位 { string tmp = cut(i, j);//获取截取的当前字符串 if (b.find(tmp) != string::npos)//在b里搜索目前截取的a的字符串是否能查到重复项 { if (tmp.size() > res.size())//判断新串是否比之前的长,如果长则替换 { res = tmp;//替换之前较短的字符串 } } } } cout << res.size() << endl;//输出重复且最长的字符串 } return 0;//返回0表示程序结束 }