编程找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
#include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> using namespace std; int GetCommon(char s1[], char s2[]) { int len1=strlen(s1); int len2=strlen(s2); int r,maxlen=0; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++) { if(s1[i]==s2[j]) { int as=i,bs=j,count=1; while(as+1<len1&&bs+1<len2 &&s1[++as]==s2[++bs]) count++; if(count>maxlen) { maxlen = count; r=i; } } } } for(int i=r;i<r+maxlen;i++) printf("%c",s1[i]); printf("\n"); return maxlen; } int main() { char a[]={"abccade"}; char b[]={"dgcadde"}; printf("%s和%s的最长公共子串是:\n",a,b); printf("长度为:%d\n",GetCommon(a,b)); return 0; }
class Solution { public String comString(String strA, String strB) { char[] a = strA.toCharArray(); char[] b = strB.toCharArray(); StringBuilder common = new StringBuilder(); String preCom = ""; int i = 0, j = 0; while (i < a.length && j < b.length) { // 在b里找一个字符跟a[i]相同,直至找到或到头儿 while (j < b.length && a[i] != b[j]) { j++; } // 回溯存档点 int index = i; while (i < a.length && j < b.length && a[i] == b[j]) { common.append(a[i]); i++; j++; } // 如果这一次找到的字符串比上一次长,更新 if (preCom.length() < common.length()) { preCom = common.toString(); } common = new StringBuilder(); // 回溯 i = index + 1; j = 0; } return preCom; } }自己试了几个测试用例倒是过了
a = input('第一个字符串:') b = input('第二个字符串:') m = [[0 for i in range(len(b)+1)] for j in range(len(a)+1)] mmax = 0 p = 0 for i in range(len(a)): for j in range(len(b)): if a[i]==b[j]: m[i+1][j+1]=m[i][j]+1 if m[i+1][j+1]>mmax: mmax=m[i+1][j+1] p=i+1 print (a[p-mmax:mmax])
#include "iostream" using namespace std; struct record//此结构体用于记录历史上最大的子串信息 { int i; int j; int size; public: record(int a, int b, int c) { i = a; j = b; size = c; } void remember(int a, int b, int c) { i = a; j = b; size = c; } }; int _tmain(int argc, _TCHAR* argv[]) { //输入部分 char* str1 = new char[100]; char* str2 = new char[100]; fstream fin("10.txt"); fin >> str1; fin >> str2; int strlen1 = strlen(str1); int strlen2 = strlen(str2); record rec(0, 0, 0); for (int i = 0; i < strlen1 && (strlen1 - i) >= rec.size;i++) {//当横向遍历剩下的字符数目小于历史记录中最大子串的长度时候 则没有必要遍历之后的所有字符 for (int j = 0; j < strlen2 && (strlen2 - j) >= rec.size; j++) {//当纵向遍历剩下的字符数目小于历史记录中最大子串的长度时候 则没有必要遍历之后的所有字符int ti = i;
int tj = j;
int count = 0;
while (str1[ti]!='\0'&&str2[tj]!='\0'&&str1[ti] == str2[tj])
{
count++;
ti++;
tj++;
}
if (count > rec.size)
{
rec.remember(i, j, count);
}
}
}
int k = rec.i;
for (int i = 0; i < rec.size; i++, k++)
{
cout << str1[k];
}
return 0;
}
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String s1=scanner.nextLine(); String s2=scanner.nextLine(); //找出两个字符串中谁的长度长 String min=(s1.length()<=s2.length())?s1:s2; String max=(min.equals(s1))?s2:s1; //如果长的字符串包含短的字符串,直接返回 if(max.contains(min)){ System.out.println(min); return; } //字符串从末尾开始慢慢缩减长度,如果包含就直接输出并返回即可 //外层循环控制start的起始位置 for(int i=0;i<min.length();i++){ //每次都是从末端缩减长度,这样的话,如果包含就可以直接输出,即为包含的最长的字符串 for(int start=i,end=min.length();end>start+1;end--){ String temp=min.substring(start,end); if(max.contains(temp)){ System.out.println(temp); return; } } } } }
private static String getSameStringInfo(String strFirst,String strSecond){ int strLengthFirst = strFirst.length(); String finallyStr = null; int lengthFlag = 0; for (int i = 0; i < strLengthFirst; i++) { for (int j = i+1; j <= strLengthFirst; j++) { String newStr = strFirst.substring(i,j); if (strSecond.contains(newStr) && newStr.length() > lengthFlag){ lengthFlag = newStr.length(); finallyStr = newStr; } } } return finallyStr; }
public class sameString { public static void main(String[] args){ String s1="abccade"; String s2="dgadde"; System.out.println("s1和s2最大相同子串为:"+getMaxString(s1,s2)); } public static String getMaxString(String s1,String s2){ String max="",min=""; max=(s1.length()>s2.length())?s1:s2; min=(max==s1)?s2:s1; for(int x=0;x<min.length();x++){ for(int y=0,z=min.length()-x;z<min.length();y++,z++){ String temp=min.substring(y,z); if(max.contains(temp)){ return temp; } } } return ""; } }
#include<iostream> #include<algorithm> #include<vector> #include<string>using namespace std;string longestCommonSubstring(string &A, string &B) { int Alen = A.size(); int Blen = B.size(); if (Alen == 0 || Blen == 0) { return 0; } int max = 0; int flag = 0; for (int i = 0; i < Alen; i++) { for (int j = 0; j < Blen; j++) { int m = i, n = j; int len = 0; while (m < Alen && n < Blen) { if (A[m] != B[n]) { break; } m++; n++; len++; } if (len > max) { flag = n; max = len; } } } return A.substr(flag - max, flag - 1); }int main() { string s1, s2; cin >> s1 >> s2; string res = longestCommonSubstring(s1, s2); cout << res << endl; return 0; }
public static String getSubString(String s1,String s2) { //找出长度较小的字符串 String min = s1.length()<s2.length()?s1:s2; String max = min.equals(s1)?s2:s1; //字符串的截取和比较 for(int i=0; i<min.length(); i++){ //控制前后下标的移动 int j=0, k=min.length()-i; while(k <= min.length()){ String sub = min.substring(j,k); if(max.contains(sub)){ return sub; } j++; k++; } } return null; }