前言
花了半小时时间很暴力的解决了一个子串计算的问题,感觉还挺有意思的,这里记录一下!
题目
题目描述: 给出一个01字符串(长度不超过100),求其每一个子串出现的次数。 输入: 输入包含多行,每行一个字符串。 输出: 对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。 样例输入: 10101 样例输出: 0 2 01 2 1 3 10 2 101 2
代码(c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cstr {
char s[101];
} cstr;
int compare(const void *p, const void *q)
{
const cstr *a = p;
const cstr *b = q;
return strcmp(a->s, b->s);
}
int main(void)
{
int i, j, k, len, index, num;
cstr cs[100000];
char str[101];
char tmp[101];
while (scanf("%s", str) != EOF) {
len = strlen(str);
index = 0;
// 获取所有子串
for (i = 1; i <= len; i ++) {
for (j = 0; j + i <= len; j ++) {
memset(tmp, ' ', sizeof(tmp));
for (k = 0; k < i; k ++)
tmp[k] = str[j + k];
strcpy(cs[index].s, tmp);
index ++;
}
}
// 按字典升序排序
qsort(cs, index, sizeof(cs[0]), compare);
// 计算子串出现次数
for (i = 0; i < index;) {
j = i + 1;
num = 1;
while (j < index) {
if (strcmp(cs[i].s, cs[j].s) == 0) {
num ++;
j ++;
} else {
break;
}
}
if (num > 1)
printf("%s %d
", cs[i].s, num);
i = j;
}
}
return 0;
}
/**************************************************************
Problem: 1149
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:10708 kb
****************************************************************/