首页 > 试题广场 >

编程找出两个字符串中最大公共子字符串,如"abccade",

[问答题]

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


发表于 2019-06-03 17:02:41 回复(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;
    }
}    

自己试了几个测试用例倒是过了
发表于 2020-10-30 12:09:28 回复(0)
/**
     * 最长公共子序列
     */
    public static void main(String[] args) {
 
        Scanner scan = new Scanner(System.in);
        String s1 = scan.nextLine();
        String s2 = scan.nextLine();
        String maxSubString = getSubString(s1, s2);
        System.out.println("maxSubString:"+maxSubString);
    }
    /**
     * 用到subString(start,end)方法,依次缩减字符串
     * @param s1
     * @param s2
     * @return
     */
    public static String getSubString(String s1,String s2){
        //记录相同字符串
        String sameString = null;
        //比较两个字符串的长度,这里是设置s1的长度大于s2
        if(s1.length()<s2.length()){
            //如果s2的长度大,那么就将两个字符串进行替换
            String temp = s1;
            s1 = s2;
            s2 = temp;
        }
        //如果s2就被包含在s1中,那么这两个字符串最大的字串就是s2
        boolean isContains = s1.contains(s2);
        if(isContains){
            return s2;
        }else{
            boolean b1 = false;
            //如果s2不是两个字符串最大的子类,那么在进行循环查找
            for(int i=0;i<s2.length();i++){
                for(int j=0;j<=i;j++){
                    //获取每次进行比较的子字符串
                    String str = s2.substring(j,s2.length()-i+j);
                    System.out.println("第"+i+"次比较:"+str);
                    if(s1.contains(str)){
                        sameString =str;
                        b1 = true;
                        break;
                    }
                }
            //如果比较到s2中最小的为2的时候还没有想同的字符串,我们就默认没有相同的子字符串
                if(s2.substring(0, s2.length()-i).length() ==2){
                    System.out.println("没有相同的子字符串");
                    b1 = true;
                    break;
                }
                if(b1 ==true){
                    break;
                }
            }
            
        }
        
        return sameString;
        
    }
编辑于 2019-06-03 21:37:26 回复(0)
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])

发表于 2019-03-03 17:14:00 回复(0)
 
发表于 2019-03-03 13:01:48 回复(0)
#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;
}



发表于 2018-08-07 16:09:41 回复(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;
                }
            }
        }
        
    }
}

发表于 2019-02-21 20:59:35 回复(1)
import java.util.Scanner;

public class StringCompare {
    public static void main(String [] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        String maxSubString= getSubString(s1,s2);
        System.out.println("maxSubString:"+maxSubString);
        
    }
    /**
     *首先判断两个字符串的长度,再比较短字符串是否包含在长字符串里,
     *若包含直接返回段字符串,若不包含则缩减短字符串再进行比较; 
     *用到substring(start,end)方法,依次缩减字符串
     */
    
    public static String getSubString(String s1,String s2) {
        //第一步判断两个字符串的长度
        String min = (s1.length()<s2.length())?s1:s2;
        String max = (min.equals(s1))?s2:s1;
        System.out.println("min:"+min);
        System.out.println("max:"+max);
        for(int i=0;i<min.length();i++) {
            for(int start=0,end=min.length()-i;end<=min.length();start++,end++) {
                String temp = min.substring(start, end);
                if(max.contains(temp)) {
                    return temp;
                }
                
            }
        }
        
        return null;
    }
}

发表于 2018-08-07 10:47:05 回复(1)
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;
    }

发表于 2022-02-23 15:42:20 回复(0)
// 参考答案写成的c++版
#include<iostream>
#include<string>
using namespace std;

string cmp(string  &s1, string &s2)
{

    int index,start, max_l=0,num=0;
    int s1_len = s1.size();
    int s2_len = s2.size();
    char *str;
    for(int i=0; i< s1_len; i++)
    {
        for(int j=0; j< s2_len; j++)
        {
            int start1=i;
            int start2=j;
            while((start1 <= s1_len-1) && (start2 <= s2_len-1) && (s1[start1++] == s2[start2++]))
            {
                num++;
            }
            if(num > max_l)// 如果num是当前最大匹配的个数,则赋给max,并且在start记下str1最长匹配开始的位置
            {
                max_l=num;
                start=i;
            }
            else{
                num=0;// 如果num不是当前最大的,则赋为0值继续循环
            }

        }

    }
    return s1.substr(start, max_l);
}

int main()
{
    string s1, s2;
    cin >> s1 >> s2;
    string res = cmp(s1, s2);
    cout<<res;
    return 0;
}

发表于 2021-10-25 17:57:27 回复(0)

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 "";
	}
	}


发表于 2020-06-06 09:07:02 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1, s2;
    while (cin >> s1 >> s2)
    {
        int arr[255][255];
        int max = 0;
        int end = 0;
        for (int i = 0; i < s1.size(); ++i)
        {
            for (int j = 0; j < s2.size(); ++j)
            {
                if (s1[i] == s2[j])
                {
                    if (i == 0 || j == 0)   //行头或列头
                        arr[i][j] = 1;
                    else
                        arr[i][j] = arr[i - 1][j - 1] + 1;
                }
                else
                    arr[i][j] = 0;
                if (arr[i][j] > max)
                {
                    max = arr[i][j];
                    end = i;
                }

            }
        }
        cout << max << endl;
        for (int i = end - max + 1; i <= end; ++i)
            cout << s1[i];
        cout << endl;
    }
    system("pause");
    return 0;
}
发表于 2019-09-14 23:34:03 回复(0)
public class test {
    public static void main(String[] args) {
        String s1 = "abccade";
        String s2 = "dgcadde";
        
        int maxLen = 0;
        String maxSS = null;
        
        for(int i=0; i < s1.length(); i++) {
            for(int j = 0; j < s2.length(); j++) {
                if(s2.charAt(j) == s1.charAt(i)) {
                    StringBuilder ss = new StringBuilder();
                    int ii = i, jj = j;
                    while(ii<s1.length() && jj<s2.length() && s2.charAt(jj) == s1.charAt(ii)) {
                        ss.append(s1.charAt(ii));
                        ii++;jj++;
                    }
                    if(ss.length() > maxLen) {
                        maxLen = ss.length();
                        maxSS = new String(ss);
                    }
                }
            }
        }
        System.out.println(maxSS);
        
    }
}
发表于 2019-07-02 13:54:22 回复(0)
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class MaxSharedString {

    public static ArrayList<String> maxSharedString(String str1, String str2) {
        ArrayList<String> maxSharedString = new ArrayList<>();
        Set<String> set = new HashSet<>();        
        String stringTemp = "";
        int maxSizeOfString = 0;
        
        // 遍历字符串,以str1为基准,查找str1和str2的所有公共字符串
        for (int i = 0; i < str1.length(); i++) {
            int j = i;
            for (int k = 0; k < str2.length(); k++) {
                int l = k;
                // 如果两个字符串中,某个字符相等,则比对对应的下一个字符,直到对应两个字符不等
                while (str1.charAt(j) == str2.charAt(l)) {
                    stringTemp += str1.charAt(j);
                    // System.out.println(stringTemp);
                    j++;
                    l++;
                    // 如果比对的字符范围超过了字符串的长度范围,则跳出while循环
                    if (j >= str1.length() || l >= str2.length()) {
                        break;
                    
                    
                }
                set.add(stringTemp); // 添加公共字符串到set集合中,以去除重复的元素
                stringTemp = ""; // 存放公共字符串的临时字符串清空,用于下一个循环的存放
                j = i;           // 回到初始状态,重新进入外层for循环
            }
        }
        
        // System.out.println(set);
        // 将set转化为ArrayList,以计算其中存放的每个公共字符串的长度
        ArrayList<String> arrayList = new ArrayList<>(set);
        for (int i = 0; i < arrayList.size(); i++) {
            if (arrayList.get(i).length() > maxSizeOfString) {
                maxSizeOfString = arrayList.get(i).length();// 计算其中存放的最大公共字符串的长度
            }
        }
        // System.out.println("maxSizeOfString = " + maxSizeOfString);
        
        // 将所有具有最大长度的公共字符串,存放在一个新的ArrayList——maxSharedString中
        for (int i = 0; i < arrayList.size(); i++) {
            if (arrayList.get(i).length() == maxSizeOfString) {
                maxSharedString.add(arrayList.get(i));
            }
        }
        
        return maxSharedString;
    }
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        String str2 = scanner.next();
        scanner.close();
        ArrayList<String> maxSharedString = maxSharedString(str1, str2);
        // 循环打印出ArrayList——maxSharedString中的所有最大公共字符串
        for (int i = 0; i < maxSharedString.size(); i++) {
            System.out.println(maxSharedString.get(i));
        }
    }
}



发表于 2019-06-04 11:36:18 回复(0)
#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; }

发表于 2019-05-28 17:07:09 回复(0)
#include <stdio.h> 
#include <string.h> 

int main(){
    char a[]="abccade";
    char b[]="dgcadde";
    int tempMax=0;
    int maxLen=0;
    int startA,startB,m,n;
    int flag=0;
    int tempM,tempN;
    int lenA=strlen(a);
    int lenB=strlen(b);
    int i,j;
    for(i=0;i<lenA;i++){
        for(j=0;j<lenB;j++){
            if(a[i]==b[j]){
                startA=i;
                m=startA;
                startB=j;
                n=startB;
                while(a[m++]==b[n++] && m<lenA-1 && n<lenB-1 ){
                    maxLen++;
                }
                if(maxLen > tempMax){
                    tempMax=maxLen;
                    tempM=startA;
                    maxLen=0;
                }
            }
        }
    }
    for(i=tempM;i<tempMax+tempM;i++){
        printf("%c",a[i]);
    }
    return 0;
}
发表于 2019-03-03 09:54:41 回复(0)
这道题我的代码没有考虑到多个相同长度字符串的问题,但是也通过了~
发表于 2018-09-28 10:51:33 回复(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; }
发表于 2018-09-05 15:13:26 回复(0)

发表于 2018-08-18 23:58:07 回复(0)
void findsamea(char s1[], char s2[],int len1, int len2)
{
    char *p1 = s1;
    char *p2 = s2;
    int num,max=0;
    int start;
    for(int i=0;i<len1;i++)
        for (int j = 0; j < len2; j++)
        {
            num = 0;
            int start1 = i;
            int start2 = j;
            while ((start1 <= len1 - 1 && start2 <= len2 - 1)
                && (p1[start1++] == p2[start2++]))
                num++;
            if (num>max)
            {
                max = num;
                start = i;
            }
            
        }
    for (int i = start; i < start+max; i++)
        cout << p1[i];
    cout << endl;
}
发表于 2018-08-14 17:32:37 回复(1)