这些题目都是大一刚入学时学习C语言的课后作业,在OJ上看到还保留着,就都整理下发出来吧......(只有题和代码)
【问题描述】
编写一个程序,对输入的字符串s和t,求其最长的公共子字符串。
【输入形式】
从屏幕分行读入串s和t。s和t由任意字符构成,长度都不超50个字符。输入数据确保只有唯一的最长公共子串。如果没有公共子串,打印No Answer
【输出形式】
在单独行上输出串s和串t的最长公共子串,在结尾输出一个回车符。
算法提示:用一个int型的计数器记录当前匹配长度,用一个字符数组记录当前匹配子串,如果存在更长子串,则进行相应替换。
【样例说明】
假设从屏幕输入以下内容:
aabcdababce
12abcabcdace
则输出内容为:
abcda
【评分标准】
结果完全正确得20分,每个测试点4分,提交程序文件名为c0505.c。
【代码】
这题其实可以用滑窗(sliding windows)做,但是大一新生想到滑窗...太难了
下面是代码:
#include
#include
int main()
{
int z=0;
char s[50];char t[50];
while(1)
{
s[z]=getchar();
if((int)s[z]==10)
{
s[z]='\0';
break;
}
z++;
}//输入字符串,不过warming是因为可能越界(gets())???
//改了后没毛病了......
int v=0;
while(1)
{
t[v]=getchar();
if((int)t[v]==10)
{
t[v]='\0';
break;
}
v++;
}
int num = 0;int save;
int i,j,index,sb = 0;//定位
int k=0;
save = num;
for (i = 0; i < z; i++)
{
for (j = 0; j < v; j++)
{
if (s[i] == t[j])
{
index = i;
int q = i;
int w = j;
while (s[q] == t[w])
{
q++;
w++;
num++;
k=1;
}
}
if (save < num)
{
sb = index;
save = num;
}
num = 0;
}
}
if (k==0)
{
printf("No Answer");
return 0;
}
for (i = sb; i < sb + save; i++)
printf("%c", s[i]);
return 0;
}
PS:由于当时刚学C语言,很多代码显得很稚嫩...需要的人见谅...