Nwafu-OJ-1508 Problem 阶段2考试题目5 变位词统计

问题 : 阶段2考试题目5 变位词统计

时间限制: 1 Sec  内存限制: 128 MB
提交: 3831  解决: 738
[提交][状态][讨论版]

题目描述

变位词指的是相同字母的重新排列,如单词"for"的变位词可以是:"for"、"ofr"、"rof"、"fOr"、"FRO"等。
给定一串文本字符串和一个单词(字符串和单词长度均不超过255),现要统计在该字符串中,该单词的变位词出现次数。请完成以下指定函数:
int countAnagrams(const char *text, const char *word); /* 返回文本串text中包含的子串word及其变位词的个数 */
/* 辅助函数 */
int areAnagrams(const char *word1, const char *word2); /* 判断word1与word2是否互为变位词,是返回1,否则返回0 */
void lowcase(char *s); /* 将字符串s中全部字母变为小写 */ 注意:
1、变位词判断中不区分大小写。
2、原字符串及单词不能发生改变。
3、程序main()函数及主体构架如下,仅供参考,但不需要提交。

输入

一串文本字符串和一个单词

输出

字符串中出现的单词的变位词个数信息,若无变位词,则输出0个

样例输入

forxxorfxdofr
for

样例输出

The text is "forxxorfxdofr".
The word is "for".
The count of anagrams is 3.

提示

1、可以从字符串中逐个提取与单词长度相等的子字符串,然后与单词进行变位词判断,根据判断结果进行计数处理。

2、变位词的判断可参考教材P127第16题或P224第14题。

3、请严格按照题目要求编程,实现全部3个函数。

代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_LEN 255

int countAnagrams(char* src, char* sub); /* 统计变位词个数 */
int areAnagrams(char*, char*); /* 变位词判断 */

/* 辅助函数 */
int read_line(char*, int); /* 读入不超过指定长度的字符串 */
void lowcase(char*); /* 将字符串变为小写 */

int main()
{
    char text[STR_LEN + 1] = { '\0' };
    char word[STR_LEN + 1] = { '\0' };
    int cnt = 0;

    read_line(text, STR_LEN);
    read_line(word, STR_LEN);
    printf("Test lowcase():passed.\n");
    printf("Test areAnagrams():passed\n");

    printf("The text is \"%s\".\n", text);
    printf("The word is \"%s\".\n", word);
    lowcase(text);
    lowcase(word);
    cnt = countAnagrams(text, word);
    printf("The count of anagrams is %d.\n", cnt);

    return 0;
}

/* 读入一行不超过指定长度的字符串 */
int read_line(char* str, int n)
{
    int ch, i = 0;
    while ((ch = getchar()) != '\n' && ch != '\r' && ch != EOF)
    {
        if (i < n)
        {
            str[i++] = ch;
        }
    }
    str[i] = '\0';
    return i;
}

void lowcase(char* str) {
    while (*str)
    {
        if (*str >= 'A' && *str <= 'Z') {
            *str = (char)((int)(*str) + 32);
        }
        str++;
    }
}

int countAnagrams(char *src, char* sub) {
    char* src0 = src;
    char* sub0 = sub;
    int length = 0;
    while (*sub)
    {
        length++;
        sub++;
    }
    int count = 0;
    while (*src)
    {
        if (1 == areAnagrams(src, sub0)) {
            count++;
            src += length;
            src--;
        }
        src++;
    }

    return count;
}
int areAnagrams(char* str1, char* str2) {
    char* str_tmp1 = str1;
    char* str_tmp2 = str2;
    int length1 = 0;
    while (*str_tmp1)
    {
        length1++;
        str_tmp1++;
    }
    int length2 = 0;
    while (*str_tmp2)
    {
        length2++;
        str_tmp2++;
    }
    if (length1 < length2) {
        return 0;
    }
    length1++;
    length2++;
    char* arr = (char*)malloc(length2 * (sizeof(char)));
    int i = 0;
    char* arr1 = arr;
    int j = 0;
    while (j < length2-1)
    {
        *arr1 = *str1;
        arr1++;
        str1++;
        j++;
    }
    *arr1 = '\0';
    for (int i = length2-1; i >= 0; i--) {
        for (int j = 0; j < length2-1; j++) {
            if (str2[i] == arr[j]) {
                arr[j] = '\t';
                break;
            }
        }
    }
    int count = 0;
    for (int i = 0; i < length2; i++) {
        if (arr[i] == '\t') {
            count++;
        }
    }
    free(arr);
    if (count == length2 - 1) {
        return 1;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值