题解 | #最长公共子串#
最长公共子串
https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac
/*写得很垃圾,总体思路就是当str1[i-1]==str2[j-1]时dp[i][j]=dp[i-1][j-1]+1,当不相等时dp[i][j]=0,然后用Max表示最大子串,s1表示最大子串时对应str2时所指向的字符即str2[j-1],然后向前倒退Max个字符就是子串,用数组保存返回即可*/ /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ int dp[5001][5001]; char b[5001]; char* LCS(char* str1, char* str2 ) { int len1 = strlen(str1),len2 = strlen(str2),i,j; long Max = 0; int s1=0; for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { if(str1[i-1] == str2[j-1]) { dp[i][j] = dp[i-1][j-1]+1; if(dp[i][j]>Max) { Max = dp[i][j]; s1 = j; } } else dp[i][j] = 0; } } b[Max]=0; while(Max) { b[Max-1]=str2[s1-1]; Max--; s1--; } return b; // write code here }