给两个字符串,输出其最长共同字符串的长度:如
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];
}