问题 : 阶段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;
}