题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入例子:
abcdefghijklmnop abcsafjklmnopqrstuvw
输出例子:
jklmnop
【一解】
- #include<iostream>
- #include<string>
- using namespace std;
-
- string lcs(string str1, string str2)
- {
- int len1 = str1.size();
- int len2 = str2.size();
- string big = len1>len2 ? str1:str2;
- string small= len1>len2 ? str2:str1;
- int len = small.size();
- for(int i=len; i>=1; i--)
- {
- for(int j=0; j<=len-i; j++)
- {
- string sub = small.substr(j,i);
-
- if(big.find(sub) != -1)
- return sub;
- }
- }
- return 0;
- }
- int main()
- {
- string s1,s2;
- while(cin>>s1)
- {
- cin>>s2;
- cout<<lcs(s1,s2)<<endl;
- }
- return 0;
- }
【二解】
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- string str1, str2;
- while(cin>>str1>>str2)
- {
- string str;
- if(str1.length() > str2.length())
- {
- str = str2;
- str2 = str1;
- str1 = str;
- }
- int i=0, j=0, num=0;
- string temp;
- for(i=0; i<str1.length(); i++)
- for(j=1; j<str1.length()-i; j++)
- {
- str=str1.substr(i,j); //从第i个字母开始,连续j个字符
- if(str2.find(str) != str2.npos && num<str.length())
- {
- num = str.length();
- temp = str;
- }
- }
- cout<<temp<<endl;
- }
- return 0;
- }
****************相关************
求最长公共子串的长度
输入: asdfas werasdfaswer
输出:6
【代码】
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- string str1, str2;
- while(cin>>str1>>str2)
- {
- string str;
- if(str1.length() > str2.length())
- {
- str = str2;
- str2 = str1;
- str1 = str;
- }
- int i=0, j=0;
- set<int> s;
- for(int i=0; i<str1.length(); i++)
- for(int j=1; j<str1.length()-i; j++)
- {
- str=str1.substr(i,j); //从第i个字母开始,连续j个字符
- if(str2.find(str) != str2.npos)
- {
- s.insert(j);
- }
- }
- cout<<s.size()<<endl;
- }
- return 0;
- }
-