字串核对(c/python)

52 篇文章 0 订阅
37 篇文章 0 订阅

C代码

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int search(char *input, char *key, int p);
void substring(char *test, char *temp, int h, int k);
int skip[256];
int main()
{
    char str_input[100];
    char str_key[50];

    printf("请输入字串:");
    gets_s(str_input);
    printf("请输入关键字:");
    gets_s(str_key);

    int m, n;
    char temp[80] = { '\0' };
    m = strlen(str_input);
    n = strlen(str_key);
    int p;
    p = search(str_input, str_key, n - 1);
    while (p != -1)
    {
        substring(str_input, temp, p, m);  //从匹配到的字串往后打印到结尾
        printf("%s\n", temp);
        search(str_input, str_key, p + n + 1); //p+n+1 为下一次查找的起始位置
    }
    system("pause");
    return 0;
}

void table(char *key) {
    int k, n;
    n = strlen(key);
    for (k = 0; k <= 255; k++)  
    {
        skip[k] = n;
    }
    for (k = 0; k < n - 1; k++)
    {
        skip[key[k]] = n - k - 1;  
        //表示p在关键字第k个字符下一步前进的字符数
        //如 字串yangwenbin  关键字ang
        //a 对应2,n对应1 其他的前进3个字符也就是关键字长度
    }
}

int search(char *input, char *key, int p)
{
    int m,n;
    char temp[80] = { '\0' };
    m = strlen(input);
    n = strlen(key);
    while (p < m)
    {
        substring(input, temp, p - n + 1, p);
        if (!strcmp(key, temp))  //判断temp与key是否相等,相等则执行if语句
        {
            return p - n + 1;
        }
        p += skip[input[p]];    
        //如yangwenbin  关键字为ang
        //第一次从n-1=2 (p在n位置)开始,yan与ang不匹配,跳到下一个位置p+=skip[input[p]]
        //skip[input[p]]=skip[input[2]]
        //即skip[input[p]]=skip['n'],字符n对应1,即p+1=3下个p的位置
    }
    return -1;
}
void substring(char *text, char *temp, int h, int k)
{
    int i, j;
    for (i = h, j = 0; i <= k; i++, j++)
    {
        temp[j] = text[i];  
    }
    temp[j]= '\0';
}

python代码

# -*- coding: utf-8 -*-
"""
Created on Sat Nov  4 20:22:59 2017

@author: yangwenbin
"""
#import numpy as np 

skip={} 
def table(key):
    for j in range(len(key)-1):
        skip[key[j]]=len(key)-j-1
        pass   #定义一个字典,key中的每个字符对应该字符前进的字符数目
def search(str_Input,str_Key,p):
    m=len(str_Input)
    n=len(str_Key)
    temp=[0]*len(str_key)
    while p<m:
        flag=True
        sub_str(str_Input,temp,p-n+1,p)
        if temp == list(str_Key):
            return p-n+1

    ##如p所在位置不是key中的字母,则p加上key的上度
        for i in range(n-1):
            if str_Input[p]==str_Key[i]:         
                p+=skip[str_Input[p]]
                flag=False  
                pass
            pass
        if flag:
            p+=n
        pass
    return -1
def sub_str(text,temp,h,k):
    a=list(range(h,k+1))
    b=list(range(0,k))
    ab=zip(a,b)
    for i,j in ab:
        temp[j]=text[i]
        pass
if __name__=="__main__":
    print("请输入字串:")
    str_input=input()
    print("请输入关键字:")
    str_key=input()
    table(str_key)
    m=len(str_input)
    n=len(str_key)

    p=search(str_input,str_key,n-1)
    temp=[0]*(m-p)
    while p!=-1:
      sub_str(str_input,temp,p,m-1)
      #temp=temp.remove(0)
      #print (temp.remove(0))
      print("".join('%s' %id for id in temp))

      p=search(str_input,str_key,p+n+1)
      temp=[0]*(m-p)
      pass 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值