USTCOJ 1365 字符串计数

原题在这里。是在[01]+串中找出所有(01)+的数目。


以下是常规版本,来自zeng24。该版本类似计数。

#include <stdio.h>
#define N 120

main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        int count = 0;
        char str[N];
        scanf("%s", &str);
        int i, j;
        for(i = 0; str[i] =='0' || str[i] =='1'; ++i)   //对于"010101",for循环执行三次,每一次循环执行到26行时t的值分别为3、2、1。
        {                                               //而3+2+1恰好是"010101"中包含的(01)+的个数。
            int t = 0;j = i;
            while(j < N)                                //预设的N够大,因此可以不用考虑超过字符串
            {
                if(str[j] - str[j+1] == -1)
                {
                    ++t;
                    j += 2;
                }
                else
                    break;
            }
            count += t;
        }
        printf("%d\n", count);
    }
    return 0;
}

优化版本:

#include <stdio.h>
#define N 120

main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        int count = 0;
        char str[N];
        scanf("%s", &str);
        int i = 0;
        while (str[i] =='0' || str[i] =='1')   //对于"010101",for循环执行三次,每一次循环执行26行时t的值分别为3、2、1。
        {                                      //而3+2+1恰好是"010101"中包含的(01)+的个数。
            int t = 0;
            while(str[i] - str[i+1] == -1)     //预设的N够大,条件必然有不成立的时候
            {
                t++;
                i += 2;
            }
            if (t)
                i--;
            else
                i++;
            count += (t+1) * t / 2;
        }
        printf("%d\n", count);
    }
    return 0;
}



以下是递归实现,来自 ly80。

#include<stdio.h>
#define N 120

void cal(char *str, int *num)
{
    if(*str == '0' && *(str+1) == '1')
    {
        (*num)++;
        cal(str+2, num);
    }
    else if(*str == '1' || *str == '0')
    {
        if (*num)
            ++num;
        cal(str+1, num);
    }
}

int main(void)
{
    int n;  
    scanf("%d ",&n);    
    while (n--)
    {       
        char str[N] = {0};  //字符      
        int num[N] = {0};   //计数,num[i]表示str中第i个连续(01)的个数。
                            //如010100111,num[0]等于2,num[1]等于2。其他num值均为0。
        gets(str);      
        cal(str, num);
        int i, sum = 0;
        for(i = 0; num[i]; i++)
            sum += (num[i]+1) * num[i] / 2;
        printf("%d\n", sum);
    }
    return 0;
}

你可能感兴趣的:(字符串计数,ustcoj)