当前位置:编程学习 > html/css >>

子串计算

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


题目

题目描述: 给出一个01字符串(长度不超过100),求其每一个子串出现的次数。 输入: 输入包含多行,每行一个字符串。 输出: 对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。 样例输入: 10101 样例输出: 0 2 01 2 1 3 10 2 101 2
#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
****************************************************************/

 

补充:web前端 , HTML/CSS  ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,