字串统计

 1 #include<stdio.h>
 2 #include<string.h>
 3
 4 //定义子串参数结构体
 5 struct sub_str
 6 {
 7     char sstr[61]; //子串
 8     int len; //子串长度
 9     int times; //子串出现的次数
10 };
11
12 int main()
13 {
14     int i,j,k;
15     int l,l_temp; //l:用于记录输入的要统计的子串的最小长度;l_temp:用于记录遍历子串时的临时动态子串长度
16     char str[61],sstr_temp[61]; //str:用于指向输入的要统计的字符串;sstr_temp:用于指向当前统计的子串
17     int str_len; //用于记录输入的要统计的字符串的长度
18     struct sub_str substr[1830]; //substr[1830]:用于记录各个子串的参数,最多有1+2+3+···+60个子串
19     struct sub_str substr_temp; //substr_temp:用于对substr[1830]中的子串进行排序时交换顺序的临时中间结构体变量
20     int sstr_num=0; //用于统计存入substr[1830]中的实际子串数量
21     int max_times; //用于记录子串出现的最大次数
22
23     //输入
24     scanf("%d",&l); //输入统计的子串的最小长度
25     getchar(); //除去输入时的回车键
26     gets(str); //输入要统计的字符串
27
28     str_len=strlen(str); //得到输入的要统计的字符串的长度
29
30     //初始临时动态子串长度为最大长度,遍历要统计的字符串中满足长度的子串
31     for(l_temp=str_len;l_temp>=l;l_temp--)
32     {
33         for(i=0;i<str_len-l_temp;i++) //长度为l_temp的子串在长度为str_len的字符串中有str_len-l_temp个
34         {
35             for(j=i,k=0;j<i+l_temp;j++,k++) //得到当前要统计的子串
36                 sstr_temp[k]=str[j];
37
38             for(k=0;k<sstr_num;k++) //查询 substr[1830] 中是否存在当前要统计的子串
39                 if(strcmp(sstr_temp,substr[k].sstr)==0) //有,则使该子串的出现次数加1
40                 {
41                     substr[k].times++;
42                     break;
43                 }
44
45             if(k==sstr_num) //没有,则在 substr[1830] 中新增该子串,并初始化各个参数
46             {
47                 strcpy(substr[sstr_num].sstr,sstr_temp);
48                 substr[sstr_num].len=l_temp;
49                 substr[sstr_num].times=1;
50                 sstr_num++; // substr[1830] 中实际的子串数量加1
51             }
52
53             memset(sstr_temp,0,sizeof(sstr_temp)); //清 0 sstr_temp[61],继续遍历该长度的子串
54         }
55     }
56
57     //采用冒泡排序法对 substr[1830] 中的子串根据出现次数进行排序
58     for(i=0;i<sstr_num-1;i++)
59     {
60         for(j=i;j<sstr_num;j++)
61         {
62             if(substr[j].times>substr[i].times)
63             {
64                 for(k=0;k<61;k++)
65                     substr_temp.sstr[k]=substr[i].sstr[k];
66                 substr_temp.len=substr[i].len;
67                 substr_temp.times=substr[i].times;
68
69                 for(k=0;k<61;k++)
70                     substr[i].sstr[k]=substr[j].sstr[k];
71                 substr[i].len=substr[j].len;
72                 substr[i].times=substr[j].times;
73
74                 for(k=0;k<61;k++)
75                     substr[j].sstr[k]=substr_temp.sstr[k];
76                 substr[j].len=substr_temp.len;
77                 substr[j].times=substr_temp.times;
78             }
79         }
80     }
81
82     //输出
83     puts(substr[0].sstr);
84
85     return 0;
86 }
时间: 2024-09-30 04:12:53

字串统计的相关文章

1501110919-蓝桥杯-算法训练 字串统计

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

蓝桥杯训练 字串统计 (暴力+substr)

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

蓝桥杯_算法训练_字串统计

其实题目已经给的很清楚了,枚举所有的情况,统计出现次数,找到符合条件的结果. 那么我们就根据这个提示完成即可: 第一步:枚举所有可能的字串: 1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int main() 5 { 6 int n; 7 char s[61]; //存放原来的字符串 8 char a[61][61]; //存放所有可能的字串 9 int i=0,j=0,r=0; 10 11 c

java 蓝桥杯算法提高 字串统计

思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数:         通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录出现次数最多的字串,          maxValue记录其出现的次数 1截取到的长度大于等于l的子串先比较是否已经存在map里, 1.1若存在,取出它的次数并+1.和最大次数比较 1.1.1若大于最大次数,将这个次数赋给最大次数,并且将子串赋给最大次数的子串 1.1.2若等于最大次数,再判断这两

字串统计 --- 蓝桥杯

问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规模和约定 n<=60 S中所有字符都是小写英文字母. 提示 枚举所有可

算法训练 字串统计

问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规模和约定 n<=60 S中所有字符都是小写英文字母. 提示 枚举所有可

魔数和魔字串

很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此).根据这几个字节的内容就可以确定文件类型,因此这几个字节的内容被称为魔数 (magic number).此外在一些程序代码中,程序员常常将在代码中出现但没有解释的数字常量或字符串称为魔数 (magic number)或魔字符串. 所谓魔数和魔字串就是指在代码中出现但没有解释的数字量或字符串.如果在某个程序中使用了魔数,那么在几个月或几年后你将很可能不知道他的含义是什么. 所谓魔数和魔字符串就是指在代码中出现但没有解释的数

(字符串)字串变位词

题目: 给定两个串a和b,问b是否是a的子串的变位词,例如输入a=hello,b=lel,lle,ello都是true,但b=elo是false.(字串是连续的) 思路: 滑动窗口思想:动态维护一个“窗口”,比如b的长度是3,考察a[0..2],a[1..3],a[2..4]是否是b的变位词,关键在于如何与b比较? hash数组统计:基于字符的特殊性,可以用[0,255]的数组来统计字符出现的次数,假设都是小写的英文字母,则用[0,25]来表示b中每个单词出现的次数,通过记录非0次出现的个数no

Bitset与字串

之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e3),输入opt, 如果opt==1,输入x,c,表示把S[x]改为c,(c是小写字母). 如果opt==2,输入字符串T,输出S种有多少个字串==T(字串可以重叠),(|T|<=10). -------------------------------------------分界线------------------------------------