编程找出两个字符串中最大公共子字符串,如"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; }