单模式匹配算法
单模式匹配算法:给定一个单词和一个字符串,查看字符串中是否存在该单词,通过调用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\n",t++) ; else printf("Set %d is not immediately decodable\n",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\n",t++) ; else printf("Set %d is not immediately decodable\n",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\n",t++) ; else printf("Set %d is not immediately decodable\n",t++) ; } return 0 ; }