#include <iostream>
#include <stdio.h>
#include <string.h>
#define N 255
using 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;
}
09给定任意俩组字符串S1和S2,请编程输出他们间的最大相同子串
最新推荐文章于 2022-02-24 01:16:27 发布