两个陷阱:
- 注意题目要求返回的是短串的第一个。
- 是最长公共字串,不是子序列。所以,在比较晚要max找最大。
#include<bits/stdc++.h> using namespace std; int main(){ string a,b; while(cin>>a>>b){ if(a.size() > b.size())// 若有多个,输出在较短串中最先出现的那个。所以短那个串放到前面,然后外循环以短串为主。这样就能保证题意。 swap(a,b); vector<vector<int>> dp(a.size()+1,vector<int>(b.size()+1,0));//其实其中内嵌了互相为0个字符,这样的话那只能是0 dp[0][0] = 0; int max_ =0, last = 0; for(int i =1; i<= a.size();i++){ for(int j = 1; j<= b.size();j++){ if(a[i-1]==b[j-1]){ dp[i][j] = dp[i-1][j-1] + 1; }else{ dp[i][j] = 0;//注意,这个题是子串而不是子序列 } if(dp[i][j]>max_){//找最长的那个 max_ = dp[i][j]; last = i - 1;//这个a和b的索引都可以,但是要看题的要求 } } } if(max_==0) cout<<"-1"<<endl;//没有公共子串 cout<<a.substr(last-max_+1,max_)<<endl;//这个a和b的索引都可以,但是要看题的要求 } }