Skip to content

Latest commit

 

History

History
85 lines (69 loc) · 4.08 KB

README.md

File metadata and controls

85 lines (69 loc) · 4.08 KB

To some string s, we will perform some replacement operations that replace groups of letters with new ones (not necessarily the same size).

Each replacement operation has 3 parameters: a starting index i, a source word x and a target word y. The rule is that if x starts at position i in the original string S, then we will replace that occurrence of x with y. If not, we do nothing.

For example, if we have s = "abcd" and we have some replacement operation i = 2, x = "cd", y = "ffff", then because "cd" starts at position 2 in the original string s, we will replace it with "ffff".

Using another example on s = "abcd", if we have both the replacement operation i = 0, x = "ab", y = "eee", as well as another replacement operation i = 2, x = "ec", y = "ffff", this second operation does nothing because in the original string s[2] = 'c', which doesn't match x[0] = 'e'.

All these operations occur simultaneously. It's guaranteed that there won't be any overlap in replacement: for example, s = "abc", indexes = [0, 1], sources = ["ab","bc"] is not a valid test case.

 

Example 1:

Input: s = "abcd", indexes = [0, 2], sources = ["a", "cd"], targets = ["eee", "ffff"]
Output: "eeebffff"
Explanation:
"a" starts at index 0 in s, so it's replaced by "eee".
"cd" starts at index 2 in s, so it's replaced by "ffff".

Example 2:

Input: s = "abcd", indexes = [0, 2], sources = ["ab","ec"], targets = ["eee","ffff"]
Output: "eeecd"
Explanation:
"ab" starts at index 0 in s, so it's replaced by "eee".
"ec" doesn't starts at index 2 in the original s, so we do nothing.

 

Constraints:

  • 0 <= s.length <= 1000
  • s consists of only lowercase English letters.
  • 0 <= indexes.length <= 100
  • 0 <= indexes[i] < s.length
  • sources.length == indexes.length
  • targets.length == indexes.length
  • 1 <= sources[i].length, targets[i].length <= 50
  • sources[i] and targets[i] consist of only lowercase English letters.

Companies:
Google

Related Topics:
String

Solution 1.

// OJ: https://leetcode.com/problems/find-and-replace-in-string/
// Author: github.com/lzl124631x
// Time: O(S + NlogN) where N is the length of `indexes`
// Space: O(N)
class Solution {
public:
    string findReplaceString(string S, vector<int>& indexes, vector<string>& sources, vector<string>& targets) {
        string ans;
        vector<int> ids(indexes.size());
        iota(begin(ids), end(ids), 0);
        sort(begin(ids), end(ids), [&](int a, int b) { return indexes[a] < indexes[b]; });
        int j = S.size() - 1;
        for (int k = indexes.size() - 1; k >= 0; --k) {
            int i = ids[k];
            int end = indexes[i] + sources[i].size();
            while (j >= end) ans += S[j--];
            if (S.substr(indexes[i], sources[i].size()) == sources[i]) {
                reverse(targets[i].begin(), targets[i].end());
                ans += targets[i];
                j = indexes[i] - 1;
            } else {
                while (j >= indexes[i]) ans += S[j--];
            }
        }
        while (j >= 0) ans += S[j--];
        reverse(begin(ans), end(ans));
        return ans;
    }
};