09给定任意俩组字符串S1和S2,请编程输出他们间的最大相同子串

来源:互联网 发布:java内存溢出 编辑:程序博客网 时间:2024/05/22 10:25
#include <iostream>#include <stdio.h>#include <string.h>#define N 255using namespace std;/*    本题题目:给定任意俩组字符串S1和S2,请编程输出他们间的最大相同子串    本题不能用KMP算法,KMP算法找到额是子串在母串中的位置,即子串是母串的一部分,与本题不一样,不要理解错误了    本解:是用暴力算法求解;    本题获得的启示,就是写一个函数的时候尽量不要写全局变量,否则你这个函数只能在这个程序中使用,别人要调用时根本没法用,比如本题    为什么要传入一个多余的char *s;其实设置一个全局变量start1更好,不用开空间,但是这样别人就在其他程序就想用你的这个函数,就没法    用了,除非他也设置一个全局变量,这样就太麻烦了,不过main函数中的全局变量到无所谓,别人不可能调用你的main函数的;*///返回字符串str1与str2的最大公共子串的长度;int maxSubString(char *str1,char *str2,char *s){    int start1=-1 ; //start1记录相同子串在str1的位置;    int longest=0;    int str1Long = strlen(str1);    int str2Long = strlen(str2);    int tempLength = 0;    for(int i =0;i<str1Long;++i){        for(int j=0;j<str2Long;++j){            //非常关键的一点,忘记了使用临时的变量来记录i,j值,这样就得不到正确的结果            int n=i,m = j;//m,n是临时变量,用来临时计数的            while(n<str1Long&&m<str2Long){                if (str1[n] == str2[m]){                    ++tempLength;//记录临时最长的公共子串的长度                    ++n;                    ++m;                }                else break;            }            if(longest < tempLength){                longest = tempLength;                start1 = i;            }            tempLength=0;//记得初始化为0        }    }    //将最大字符子串赋给s[],因为数据是可以传指针的,所以s[]在main函数也可以用,为什么这么做,就是为了不设置全局变量,达到解耦的目的;    for(int i=0;i<longest;++i){        s[i] = str1[start1];        start1++;    }    return longest;}int main(){    char str1[] = "qweh887kjl" ;    //为什么加个scanf输入到str1所指的地址windows就报错呢?    //char *str1 ="qweh887kjl" ;//    scanf("%s",str1);    char str2[] = "wekjlweh887de";    //为什么设置char *s时,传入s会发生windows运行不了呢?    char s[N];    int longest =0;    longest = maxSubString(str1,str2,s);    for(int i = 0;i<longest;++i){        printf("%c",s[i]);    }    return 0;}
0 0
原创粉丝点击