今天发现一道题,是某一个笔试的最后一道。我用C语言实现了一下。整体感觉不是很难,给大家分享一下。
来看题目:
给定一个 query 和一个 text,均由小写字母组成。
要求在 text 中找出以同样的顺序连 续出现在 query 中的最长连续字母序列的长度。
例如, query 为“acbac”,text 为 “acaccbabb”,
那么 text 中的“cba”为最长的连续出现在 query 中的字母序列,因此, 返回结果应该为其长度 3
总的来说就是在字符串里找寻匹配的小字符串的个数。
总体思路应该是:先从text中的’a’开始,与query中的’a’相等,两个都递增。text中的’c’与query中的’c’右相等,再两个递增。此时,text中的’b’不等于query中的’a’。返回到text中的’a’,query中的’c’(增了一位)。接下来就是text中的’a’开始,与query中的第二个字符’c’比较….,以此类推。等到text中的’a’与query中的字符比较完。在轮到’c’,再到’b’…,以此类推。
来看代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
给定一个 query 和一个 text,均由小写字母组成。
要求在 text 中找出以同样的顺序连 续出现在 query 中的最长连续字母序列的长度。
例如, query 为“acbac”,text 为 “acaccbabb”,
那么 text 中的“cba”为最长的连续出现在 query 中的字母序列,因此, 返回结果应该为其长度 3
*/
//query:“acbac”
//text:“acaccbabb”
int query(char *query,char *text)
{
int i,j,len,len2,max = 0,count = 0;
len = strlen(text);
len2 = strlen(query);
if(query == NULL || text == NULL || len <= 0)
{
return -1;
}
for(i=0;i<len;i++)//循环针对text
{
int tmp = i;
count = 0;
for(j=0;j<len2;j++)
{
if(text[tmp] == query[j])//相同的话同时移动
{
count++;
tmp++;
if(count > max)
max = count;
}
else
{
tmp = i;
j -= count;//j-count就是之前的刚开始的j,之后j++就到了应该重新开始的位置
count = 0;
continue;
}
}
}
return max;
}
int main()
{
int max = query("ccbac","acdbabac");
printf("%d",max);
return 0;
}
结果:
3
经过人工的检查,结果正确。值得注意的是,我在文中是只返回了对应的数字,并没有返回匹配的那堆字符串,大家可以试试,怎么才能将匹配的字符串给返回出来。可以试着增加函数的参数,在文中将匹配的字符串保存下来,最后将这一字符串返回出来。代码的可能性是无穷的,大家都可以动手试试。
原文地址:http://blog.csdn.net/tomjohnson/article/details/44834207