一个串的子串是指该串的一个连续的局部。如果不要求连续,则可称为它的子序列。
比如对串: “abcdefg” 而言,“ab”,“abd”,“bdef” 等都是它的子序列。
特别地,一个串本身,以及空串也是它的子序列。
对两个串而言,可以有许多的共同的子序列,我们关心的是:它们所共同拥有的长度最大的子序列是多长。以下代码实现了这个问题的求解。请填写划线部分缺失的代码。
注意:只填写划线部分缺少的内容,不要填写任何多余的符号或注释、说明等。例如,不要填写已经给出的小括号。
inline max(int a, int b)
{
return a>b?a:b;
}
int f(char* x, char* y)
{
if(strlen(x)==0) return 0;
if(strlen(y)==0) return 0;
if(*x == *y) return f(x+1, y+1) + 1;
return max( ______________________ );
}
int main()
{
printf("%d\n", f(“ac”,“abcd”)); //2
printf("%d\n", f(“acebbcde1133”,“xya33bc11de”)); //5,abc11
return 0;
}
答案: f(x+1,y),f(x,y+1)
一,什么是inline,inline有啥用
在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这一问题,引入inline修饰符,表示为内联函数
栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
下面来看一个例子:
#include <stdio.h>
//函数定义为inline即:内联函数
inline char* dbtest(int a)
{
return (i % 2 > 0) ? "奇" : "偶";
}
int main()
{
int i = 0;
for (i=1; i < 100; i++)
{
printf("i:%d 奇偶性:%s /n", i, dbtest(i));
}
}
上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?“奇”:"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
二、彻底搞懂指针
下面展示一些 我的练习代码
。
#include <stdio.h>
void s();//声明函数
int main(){
s();
int a=20;
printf("%d",a);
return 0;
}
void s(){
int i=6;
int* p;
p=&i;
printf("%d\n",*p);
return;//void类型 return ;
}
三,递归思想
在理解了inline内联函数的作用,以及搞懂指针之后,自己画个图就能明白了,代码中递归的思想,很容易想到结果应该填 f(x+1,y),f(x,y+1)