KMP문제입니다
//p는 찾으려는 문자열
//s는 주어지는 문자열
/*KMP Algorithm -------------------------------------------------------------------------------------------
1.시간 복잡도 O(n+m) - > pi배열을 만드는 시간 m(원하는 문자열의 길이), 주어진 문자열에서 원하는 문자열 찾는 시간 n
2.Preprocessing - > pi배열 만들기 : 원하는 문자열은 p,주어진 문자열을 s라 했을 때,
1)p의 접두사와, 접미사를 비교하여 p의 인덱스 마다 그 둘이 같은 것의 길이를 저장한다,같지 않으면 pi[i]=0
2)while문을 pi의 인덱스가 하나 증가할 때마다 돌린다(line 28)
- > 현재 p[i]의 문자가 그 전 문자들 중 하나와 같을때까지 pi배열을 검색
3)현재 문자와 그 전 문자가 같다면 j++, pi에 j 대입
3.KMP - > Preprocessing과정에서 만든 pi배열을 전달 받는다
1)while문 (line 48) - > s의 문자중 p의 문자와 같은 것을 찾는다 - > pi의 인덱스를 살펴보면 됨
- > pi배열은 p배열의 접두,접미사가 p의 현재 문자에서 얼마나 같은지 저장되어있기 때문.
2)그러므로 s와 p가 다르다면 다시 p의 처음부터 s와 비교할 필요없이 s는 계속하여 다음 문자를 pi배열과 비교하면 된다
----------------------------------------------------------------------------------------------------------*/
| 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 | #include <iostream> #include <vector> #include <string> using namespace std; vector <int> preprocessing(string p) {     int psize = p.size();     vector <int> pi(psize);     pi[0] = 0;     int j = 0;     for (int i = 1; i < psize; i++)     {         while (j > 0 && p[i] != p[j])         {             j = pi[j - 1];         }         if (p[i] == p[j])         {             pi[i] = j + 1;             j++;         }         else             pi[i] = 0;     }     return pi; } vector <int> kmp(string s,string p) {     auto pi = preprocessing(p);     vector <int> ans;     int psize = p.size();     int ssize = s.size();     int j = 0;     for (int i = 0; i < ssize; i++)     {         while (j > 0 && s[i] != p[j])//s는 전체 문자열, p는 찾으려는 문자열         {             j = pi[j - 1];         }         if (s[i] == p[j])         {             if (j == psize - 1)//마지막 문자열까지 같다면             {                 ans.push_back(i - psize + 1);//위치를 저장                 j = pi[j];             }             else                 j += 1;         }     }     return ans; } int main() {     string s, p;     getline(cin, s);     getline(cin, p);     auto matched = kmp(s, p);     cout << matched.size() << '\n';     for (auto index : matched)         cout << index + 1 << ' ';     cout << '\n'; } | cs | 
'Algorithm' 카테고리의 다른 글
| C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1325번:효율적인 해킹(DFS) 답 (0) | 2017.03.09 | 
|---|---|
| C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1325번:효율적인 해킹(BFS) 답 (0) | 2017.03.09 | 
| C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 2133번:타일채우기 답 (0) | 2017.03.09 | 
| C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 1547번:공 답 (0) | 2017.03.08 | 
| C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 5522번:카드 게임 답 (0) | 2017.03.08 |