P1321 单词覆盖还原

题目描述

一个长度为 l l l 的字符串中被反复贴有 boygirl 两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy 几个 girl

输入格式

一行被反复贴有 boygirl 两单词的字符串。

输出格式

两行,两个整数。第一行为 boy 的个数,第二行为 girl 的个数。

样例 #1

样例输入 #1

......boyogirlyy......girl.......

样例输出 #1

4
2

提示

数据保证, 3 ≤ l ≤ 255 3\le l\le255 3l255,字符串仅仅包含如下字符: .bgilory \texttt{.bgilory} .bgilory

1.题目分析

输入一段字符串,分别统计boy和girl出现的个数,根据题意两个单词可以相互覆盖,但至少有一个单词未被覆盖。
值得一提的是,这道题是只要有单词的一个字符就能够计数。

2.题目思路

将原文存储字符串数组,两个单词也分别存入数组,先遍历字符串数组,取得每一个字符,
在循环中遍历boy或者girl,之前取得的字符以及后单词长度位的字符与单词数组的每一个字符进行比较,满足一个则标记为1,内层循环结束,
判断标记是否为1,是的话计数器加一,
值得注意的是,进入下一轮循环时,需要将标记变量重置为0.
最后分别打印两个单词的数量。

3.代码实现

#include 
#include 

int main(){
    char str[255];
    scanf("%s",str);
    //存放男女相关的字符
    char boy[] = "boy";
    char girl[] = "girl";
    //boy和girl的数量 m n
    int m,n;
    m = 0;
    n = 0;
    //标记变量
    int flag;
    //计算boy个数
    for (int i = 0; i < strlen(str); ++i) {
        flag = 0;
        for (int j = 0; j < strlen(boy); ++j) {
            //有一个字符满足则算作一次覆盖
            if (str[i+j] == boy[j]){
                flag = 1;
            }
        }
        if (flag == 1){
            m++;
        }
    }
    //计算girl个数
    for (int i = 0; i < strlen(str); ++i) {
        flag = 0;
        for (int j = 0; j < strlen(girl); ++j) {
            if (str[i+j] == girl[j]){
                flag = 1;
            }
        }
        if (flag == 1){
            n++;
        }
    }
    printf("%d\n",m);
    printf("%d\n",n);

    return 0;
}

你可能感兴趣的:(刷题go,go,go,算法,c语言)