求零幺字符串的最长子串的长度——利用状态图解决

一种字符串由字符‘0’和‘1’组成,没有其他字符,以‘\0’表示字符串结束,称这种字符串为“零幺串“。

计算一个输入的”零幺串“中,最长的连续‘0’或连续’1‘的长度。

例如:”01110001111101“的最长连续子串是1-子串,其长度为5。

可以利用状态图来理清计算思路,如下图:


预设有0状态和1状态。

在0状态下:

(1)如果读入的字符是’0‘,那么仍然留在0状态,并且累计连续的0字符的数量,并与保留的最大0串长度比较,如果更长的0串,就记录新的长度;

(2)如果读入的字符是’1’,那么就转换到1状态,并且累计连续的0字符的数量,并与保留的最大0串长度比较,如果更长的0串,就记录新的长度;

        然后1字符串长度设置为1。

同样处理1状态下的情况。

最后,比较最长的0串和1串,哪个更长就返回哪个。

void get_longest_substr(char *strr, char *chout, int *nmaxlen)
{
    int count[2]= {0, 0};//记录当前状态下的0、1子串长度
    int maxcount[2]= {0, 0};//记录最长的0、1子串长度
    unsigned status=0;  //记录状态是0还是1
    unsigned char ch;

    while ((ch=*(strr++))!='\0')
    {
        switch(status)
        {
        case 0:
            if(ch=='0')
            {
                count[0]++;
                if(maxcount[0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值