leetcode 833. Find And Replace in String 题解

833. Find And Replace in String

题目:

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.

Notes:
  1. 0 <= indexes.length = sources.length = targets.length <= 100
  2. 0 < indexes[i] < S.length <= 1000
  3. All characters in given inputs are lowercase letters.
题解:

indexes按逆序排序,然后对S从右往左依次查找可替换的单词,如果出现在指定位置,则替换。由于indexes排序后,会变化,因此需要用map结构保存原来的索引。

技巧:
  1. 将indexes按逆序排序;
  2. 对字符串从右往左处理;
C++
class Solution {
public:
    string findReplaceString(string S, vector<int>& indexes, vector<string>& sources, vector<string>& targets) {
        vector<pair<int, int>> vp;
        int n = indexes.size();
        for(int i = 0; i < n; i++) {
            vp.push_back(make_pair(indexes[i], i));
        }

        // sort(vp.rbegin(), vp.rend());//对出现位置按逆序排序
        for(int i = 0; i < n; i++) {
            int pos = vp[i].first; // 指定的位置
            int ind = vp[i].second;// 要替换的单词的索引
            if(S.find(sources[ind], pos) == pos) {//如果sources[ind]出现在指定位置,则替换
                S = S.substr(0, pos) + targets[ind] + S.substr(pos+sources[ind].length());
            }
        }
        return S;
    }
};
Java
class Solution {
    public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> indList =new ArrayList<>();
        int n = indexes.length;
        for(int i = 0; i < n; i++) {
            map.put(indexes[i], i);
            indList.add(indexes[i]);
        }

        Collections.sort(indList);

        for(int i = n - 1; i >= 0; i--) {// 从右往左替换
            int pos = indList.get(i);
            int curInd = map.get(pos);
            if(S.indexOf(sources[curInd], pos) == pos) {// 检查sources[curInd]是否出现在指定pos,如果出现,则替换
                S = S.substring(0, pos) + targets[curInd] + S.substring(pos + sources[curInd].length());
            }
        }

        return S;     
    }
}
Python
class Solution(object):
    def findReplaceString(self, S, indexes, sources, targets):
        """
        :type S: str
        :type indexes: List[int]
        :type sources: List[str]
        :type targets: List[str]
        :rtype: str
        """
        dic = dict([])
        n = len(indexes)
        for i in range(n):
            dic[indexes[i]] = i 
        indexes.sort()
        j = n - 1
        while j >= 0:  # 从右往左替换
            pos = indexes[j]
            ind = dic[pos]
            if(S.find(sources[ind], pos) == pos): # //如果sources[ind]出现在指定位置,则替换
                S = S[0:pos] + targets[ind] + S[pos+len(sources[ind]):] 
            j -= 1
        return S
JavaScript
/**
 * @param {string} S
 * @param {number[]} indexes
 * @param {string[]} sources
 * @param {string[]} targets
 * @return {string}
 */
var findReplaceString = function(S, indexes, sources, targets) {
    var n = indexes.length;
    var map = new Map();
    for(let i = 0; i < n; i++) {
        map.set(indexes[i], i);
    }
    indexes.sort(function(x, y) { //对出现位置按逆序排序
        if(x < y) {
            return 1;
        }
        else if(x > y) {
            return -1;
        }
        return 0;
    });

    for(let i = 0; i < n; i++) {// 从右往左替换
        var pos = indexes[i];
        var ind = map.get(pos);
        if(S.indexOf(sources[ind], pos) == pos) {// 如果sources[ind]出现在指定位置,则替换
            S = S.substring(0, pos) + targets[ind] + S.substring(pos+ sources[ind].length);
        }
    }
    return S;  
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值