zoukankan      html  css  js  c++  java
  • 单模式匹配算法

    单模式匹配算法:给定一个单词和一个字符串,查看字符串中是否存在该单词,通过调用strstr函数进行匹配;
    下面给出相应代码实现:
    #include<iostream>
    #include<string>
    #include<stdio.h>
    #include<string.h>
     
    using namespace std ;
     
    int main()  {
        char word[1000][20] ;
        int t = 1 ;
        while(cin >> word[0])   {
            int i = 1 ;
            while(cin >> word[i++])
                if(strcmp(word[i-1],"9")==0)
                    break ;
            bool flag = true ;
            i--;
            for(int j = 0 ; j < i ; j++) {
                char *p = NULL ;
                for(int k = 0 ; k < i ; k++)    {
                    if(j == k)
                        continue ;
                    p = strstr(word[j],word[k]) ;
                    if(p == word[j])   {
                        flag = false ;
                        break ;
                    }
                }
                if(flag == false)
                    break ;
            }
            if(flag)
                printf("Set %d is immediately decodable
    ",t++) ;
            else
                printf("Set %d is not immediately decodable
    ",t++) ;
            }
        return 0 ;
    }

    同样可以使用String类型中的find函数实现:

    #include<iostream>
    #include<string>
    #include<stdio.h>
    #include<string.h>
     
    using namespace std ;
     
    int main()  {
        string word[1000] ;
        int t = 1 ;
        while(cin >> word[0])   {
            int i = 1 ;
            while(cin >> word[i++])
                if(word[i-1] == "9")
                    break ;
            bool flag = true ;
            i--;
            for(int j = 0 ; j < i ; j++) {
                int p = -1 ;
                for(int k = 0 ; k < i ; k++)    {
                    if(j == k)
                        continue ;
                    p = word[j].find(word[k]) ;
                    if(p == 0)   {
                        flag = false ;
                        break ;
                    }
                }
                if(flag == false)
                    break ;
            }
            if(flag)
                printf("Set %d is immediately decodable
    ",t++) ;
            else
                printf("Set %d is not immediately decodable
    ",t++) ;
            }
        return 0 ;
    }

    单模式匹配算法比较经典的一种方法是KMP算法,下面介绍一种通过KMP算法通过此题:
    相应代码实现如下:

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std ;
     
    void getNext( char p[] , int next[] )     {
        int len = strlen(p) ;
        next[0] = 0 ;
        int i = 0 , j = 0 ;
        for(j = 1 ; j < len ; j++) {                // i 代表最长前缀后缀长度
            while( p[i] != p[j] && i > 0  )          // 当p[i] != p[j] 时,减小最长前缀后缀长度
                i = next[i-1] ;
            if(p[i] == p[j])    {
                i++ ;                               //最长公共前缀后缀长度+1
                next[j] = i ;                       //匹配失败时跳到该处
            }
            else
                next[j] = 0 ;
        }
    }
    int main()  {
        char s[100][100] ;
     
        int t = 1 ;
        while(gets(s[0]))   {
            int next[100][100] = {0} ;
            bool flag = true ;
            getNext(s[0],next[0]) ;
            int k = 1 ;
            while(gets(s[k++])) {
                if(strcmp(s[k-1],"9")==0)
                    break ;
                getNext(s[k-1],next[k-1]) ;
            }
            for(int i = 0 ; i < k ; i++)    {
                for(int j = 0 ; j < k ; j++)    {
                    if(i == j)
                        continue ;
                    int len1 = strlen(s[i]) ;
                    int len2 = strlen(s[j]) ;
                    if(len1 >= len2)
                        continue ;
                    int jj = 0 , ii ;
                    for(ii = 0 ; ii < len2 ; ii++)
                        if(s[j][ii] == s[i][jj])
                            jj++ ;
                        else    {
                            if(jj == len1)
                                break ;
                            if(jj > 0)
                                jj = next[i][jj-1] ;
                        }
                    if(ii - len1 == 0) {
                        flag = false ;
                        break ;
                    }
            }
            if(flag == false)
                break ;
            }
            if(flag)
                printf("Set %d is immediately decodable
    ",t++) ;
            else
                printf("Set %d is not immediately decodable
    ",t++) ;
        }
        return 0 ;
    }

  • 相关阅读:
    文件管理
    字符编码
    字典练习,统计字符串中单词出现次数
    字典有关练习:购物车
    列表及列表操作方法
    字符串及用法
    变量,程序交互,基本数据类型
    /usr/bin/ld: i386:x86-64 architecture of input file `command.o' is incompatible with i386 output
    混合云存储系统开发总结
    小记6月27
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236888.html
Copyright © 2011-2022 走看看