카테고리 없음

substring matching

fw93 2018. 3. 23. 21:19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "stdafx.h"
#include <iostream>
#include <cstdio>
 
using namespace std;
 
bool issubstring(string s1, string s2) {
    int j = 0;
    for (int i = 0; i < s1.size(); i++) {
        if (s1.at(i) == s2.at(j)) {
            j++;
        }
        else {
            j = 0;
        }
        if (j == s2.size()) {
            return true;
        }
    }
    return false;
}
 
bool isrotation(string s1, string s2) {
    string s3 = s1 + s1;
    return issubstring(s3, s2);
}
 
int pi[100];
 
void kmp(char * pat) {
    int n = strlen(pat);
    int i = -1, j = 0;
    pi[j] = i;
    while (j < n) {
        if (i == -1 || (i >= 0 && pat[i] == pat[j])) {
            i++;
            j++;
            pi[j] = i;
        }
        else { i = pi[i]; }
        for (int z = 0; z <= n; z++) {
            printf("%d ", pi[z]);
        }
        printf("%d %d\n", i, j);
    }
}
 
void find_pattern(char *arr, char*pat) {
    kmp(pat);
    int n = strlen(arr);
    int m = strlen(pat);
    int i = 0, j = 0;
    while (i < n) {
        if (j == -1 || (j >= 0 && arr[i] == pat[j])) i++, j++;
        else if (arr[i] != pat[j]) j = pi[j];
        if (j == m) {
            printf("the matching %d\n", i - m + 1);
            j = pi[j];
        }
    }
}
 
int main() {
    char * s1 = "aaaaaaab";
    char * s2 = "abcabcd";
    find_pattern(s1, s2);
    while(1){}
    return 0;
}
cs