用C语言编写程序,找出用户输入的两个字符串中相同的子串,要求此输出的字符串中无重复的子串 5

如:第一个字符串200120012002第二个字符串200120022003则输出20012002... 如:第一个字符串 2001 2001 2002第二个字符串2001 2002 2003 则输出2001 2002 展开
 我来答
wuzongxian0010
2014-06-05 · TA获得超过796个赞
知道小有建树答主
回答量:433
采纳率:100%
帮助的人:335万
展开全部
// 利用经典的大数据处理算法bloomfilter进行两个集合中相同元素的查找,去重
#include <stdio.h>
#include <string.h>
unsigned char mask[8] = {128, 64, 32, 16, 8, 4, 2, 1};
// 简单的哈希算法 
int hashfuc(char* s, int key)
{
    int i, seed[4] = {5, 7 ,11, 13}, value = 0;
    if(key >= 4) key %= 4;
    for(i = 0; s[i]; i++)
        value += s[i]*seed[key];

    return value;
}

// 利用bloomfilter算法将字符串s映射到位数组m中,并去掉重复的子串 
void bloomfilter(unsigned char *m, char *s)
{
    int i, j, hvalue, brepeat;
    char substr[32];
    for(i = j = 0; ; i++) {
        if(s[i] != ' ' && s[i] != '\t' && s[i] != 0)
            substr[j++] = s[i];
        else {
            substr[j] = 0;
            brepeat = 1;
            for(j = 0; j < 4; j++) {
                hvalue = hashfuc(substr, j) & 0X7F;
                if((m[hvalue>>3] & mask[hvalue&7]) == 0) {
                    m[hvalue>>3] |= mask[hvalue&7];
                    brepeat = 0;
                }
            }
            // 如果是重复子串 
            if(brepeat == 1) {
                j = strlen(substr);
                strncpy(s+i-j, s+i+1, strlen(s)-i);
                //printf("有重复子串%s, 去重后是%s\n", substr, s);
                i = i - j - 1;
            }
            if(s[i] == 0) break;
            j = 0;
        }
    }
}

int main()
{
    char s1[256], s2[256], substr[32];
    int i, j, hvalue;
    unsigned char m1[16]={0}, m2[16]={0}, m3[16];
    printf("First string\n");
    gets(s1);
    printf("Second string\n");
    gets(s2);
    bloomfilter(m1, s1);
    bloomfilter(m2, s2);
    // 求两个位数组的交集,子串能够映射到交集说明是相同的子串 
    for(i = 0; i < 16; i ++) {
        m3[i] = m1[i] & m2[i];
        //printf("%02x %02x %02x\n", m1[i], m2[i], m3[i]);
    }
    printf("\n相同的子串有:");
    j = 0;
    // 只需要对一个字符串进行映射,只要能映射到交集的就是子串 
    for(i = 0; ; i++) {
        if(s1[i] != ' ' && s1[i] != '\t' && s1[i] != 0)
            substr[j++] = s1[i];
        else {
            substr[j] = 0;
            for(j = 0; j < 4; j++) {
                hvalue = hashfuc(substr, j) & 0X7F;
                if((m3[hvalue>>3] & mask[hvalue&7]) == 0) break;
            }
            if(j == 4) printf("%s ", substr);
            if(s1[i] == 0) break;
            j = 0;
        }
    }
    printf("\n");
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式