JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • offer
  • 多多!

Problem

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.

Code

class Solution {
    public String findReplaceString(String s, int[] indexes, String[] sources, String[] targets) {
        HashMap<Integer, String[]> map = new HashMap<>();
        for (int i = 0; i < indexes.length; i++) {
            int index = indexes[i];
            map.put(index, new String[]{sources[i], targets[i]});
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(i)) {
                String source = map.get(i)[0];
                String target = map.get(i)[1];

                if (s.substring(i, i + source.length()).equals(source)) {
                    sb.append(target);
                    i += source.length() - 1;
                } else {
                    sb.append(s.charAt(i));
                }
            } else {
                sb.append(s.charAt(i));
            }
        }

        return sb.toString();
    }
}