笔试题(1)

今天发现一道题,是某一个笔试的最后一道。我用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

经过人工的检查,结果正确。值得注意的是,我在文中是只返回了对应的数字,并没有返回匹配的那堆字符串,大家可以试试,怎么才能将匹配的字符串给返回出来。可以试着增加函数的参数,在文中将匹配的字符串保存下来,最后将这一字符串返回出来。代码的可能性是无穷的,大家都可以动手试试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值