Leetcode::remove all occurrences of a substring

point

Design

Big O(time)

Code

simple stack

class Solution {
public:
    string removeOccurrences(string s, string part) {
        string ret = "";
        int n = s.size(), m = part.size();
        for(int i = 0; i < n; i++) {
            ret.push_back(s[i]);
            if (ret.size() >= m && ret.substr(ret.size() - m, m) == part) {
                for(int j = 0; j < m; j++) ret.pop_back();
            }
        }
        return ret;
    }
};

kmp

class Solution {
public:
    void gettingLPS(int m, string part, vector<int>& LPS) {
        int len = 0;
        LPS[0] = 0;
        int i = 1;
        while(i < m) {
            if (part[len] == part[i]) {
                len++;
                LPS[i] = len;
                i++;
            } else {
                if (len != 0) {
                    len = LPS[len - 1];
                } else {
                    LPS[i] = 0;
                    i++;
                }
            }
        }
    }

    string removeOccurrences(string s, string t) {
        int n = s.size(), m = t.size();
        vector<int> kmpLPS(m, 0);
        gettingLPS(m, t, kmpLPS);
        
        stack<char> stk;
        vector<int> ptrn(n + 1, 0);

        int i = 0, j = 0;
        while (i < n) {
            stk.push(s[i]); // added
            if (s[i] == t[j]) {
                i++;
                j++;

                ptrn[stk.size()] = j; // added

                if (j == m) {
                    /* Added a block */
                    int len = m;
                    while (len != 0) {
                        stk.pop();
                        len--;
                    }
                    // j = LPS[j-1]; // deleted

                    j = (stk.empty() ? 0 : ptrn[stk.size()]);
                }
            } else {
                if (j != 0) {
                    j = kmpLPS[j - 1];
                    stk.pop(); // added
                } else {
                    ptrn[stk.size()] = 0;
                    // ret += s[i]; // deleted
                    i++;
                }
            }
        }
				string ret;
				ret.reserve(stk.size());

				while(!stk.empty()) {
		    	ret += stk.top();
    			stk.pop();
				}

				reverse(ret.begin(), ret.end());
				return ret;

    }
};