子串计算

前言

花了半小时时间很暴力的解决了一个子串计算的问题,感觉还挺有意思的,这里记录一下!

题目

题目描述:
给出一个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, '\0', 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\n", cs[i].s, num);
            i = j;
        }
    }
 
    return 0;
}
/**************************************************************
    Problem: 1149
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:10 ms
    Memory:10708 kb
****************************************************************/


 

posted @ 2013-07-31 20:17  javawebsoa  Views(640)  Comments(0Edit  收藏  举报