给两个字符串,输出其最长共同字符串的长度:如
S1: asdfghjqweryuiase
S2: astyfrtfghjqwsa
其最长共同字符串为fghjqw 长度为6,给出代码。
public static void main(String[] args) { String s1 = "asdfghjqweryuiase"; String s2 = "astyfrtfghjqwsa"; System.out.print(findMaxSame(s1, s2)); } private static String findMaxSame(String s1, String s2) { int l1 = s1.length(); String maxSame = ""; String subString = ""; for (int i = 0; i < l1; i++) { for (int j = i + 1; j < l1; j++) { subString = s1.substring(i, j); if (s2.indexOf(subString) >= 0) { maxSame = subString.length() > maxSame.length() ? subString : maxSame; } else { break; } } } return maxSame; }
package 最长公共子串; public class Main { private static int length = 0; public static void main(String[] args) { Main main = new Main(); String s1 = "asdfghjqweryuiase"; String s2 = "astyfrtfghjqwsa"; String maxStr = main.searchForCommonStr(s1, s2); System.out.println("最长公共子串为" + maxStr); System.out.println("长度为:" + length); } /** * maxStr用于记录最大公共子字符串 * maxLength用于记录最大公共子字符串的长度 * 从下标为0开始,依次截取起始下标为0的s1的子字符串substring * 依次与s2匹配有无公共字符串substring * 若有,且substring的长度大于maxLength,则maxLength = substring.length(); maxStr = substring; * 否则,继续循环 */ public String searchForCommonStr(String s1, String s2) { String maxStr = ""; int maxLength = 0; for (int start = 0; start < s1.length(); start++) { for (int end = start + 1; end < s1.length(); end++) { String substring = s1.substring(start, end); if (s2.indexOf(substring) != -1) { if (substring.length() > maxLength) { maxLength = substring.length(); maxStr = substring; length = maxLength; } } } } return maxStr; } }
return mat
const int maxn = 1501 ; vector<int> location[26] ; int c[maxn*maxn] , d[maxn*maxn] ; inline int get_max(int a,int b) { return a > b ? a : b ; } //nlogn 求lcs int lcs(char a[],char b[]) { int i , j , k , w , ans , l , r , mid ; for( i = 0 ; i < 26 ; i++) location[i].clear() ; for( i = strlen(b)-1 ; i >= 0 ; i--) location[b[i]-'a'].push_back(i) ; for( i = k = 0 ; a[i] ; i++) { for( j = 0 ; j < location[w=a[i]-'a'].size() ; j++,k++) c[k] = location[w][j] ; } d[1] = c[0] ; d[0] = -1 ; for( i = ans = 1 ; i < k ; i++) { l = 0 ; r = ans ; while( l <= r ) { mid = ( l + r ) >> 1 ; if( d[mid] >= c[i] ) r = mid - 1 ; else l = mid + 1 ; } if( r == ans ) ans++,d[r+1] = c[i] ; else if( d[r+1] > c[i] ) d[r+1] = c[i] ; } return ans ; } int main() { char a[maxn] , b[maxn] ; while (~scanf("%s%s",a,b)) { printf("%d/n",lcs(a,b)); } }
int dp(char *s1, char *s2) { int len1 = strlen(s1); int len2 = strlen(s2); int d[l1 + 10][l2 + 10]; memset(d, 0, sizeof(d)); for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (s1[i-1] == s2[j-1]) { d[i][j] = d[i-1][j-1]+1; } else d[i][j] = max(d[i-1][j], d[i][j-1]); } } return d[l1][l2]; }