[LeetCode] 833. Find And Replace in String_Medium tag: array
2021-08-12 01:47 Johnson_强生仔仔 阅读(35) 评论(0) 编辑 收藏 举报Y
ou are given a 0-indexed string s
that you must perform k
replacement operations on. The replacement operations are given as three 0-indexed parallel arrays, indices
, sources
, and targets
, all of length k
.
To complete the ith
replacement operation:
- Check if the substring
sources[i]
occurs at indexindices[i]
in the original strings
. - If it does not occur, do nothing.
- Otherwise if it does occur, replace that substring with
targets[i]
.
For example, if s = "abcd"
, indices[i] = 0
, sources[i] = "ab"
, and targets[i] = "eee"
, then the result of this replacement will be "eeecd"
.
All replacement operations must occur simultaneously, meaning the replacement operations should not affect the indexing of each other. The testcases will be generated such that the replacements will not overlap.
- For example, a testcase with
s = "abc"
,indices = [0, 1]
, andsources = ["ab","bc"]
will not be generated because the"ab"
and"bc"
replacements overlap.
Return the resulting string after performing all replacement operations on s
.
A substring is a contiguous sequence of characters in a string.
Example 1:
Input: s = "abcd", indices = [0, 2], sources = ["a", "cd"], targets = ["eee", "ffff"] Output: "eeebffff" Explanation: "a" occurs at index 0 in s, so we replace it with "eee". "cd" occurs at index 2 in s, so we replace it with "ffff".
Example 2:
Input: s = "abcd", indices = [0, 2], sources = ["ab","ec"], targets = ["eee","ffff"] Output: "eeecd" Explanation: "ab" occurs at index 0 in s, so we replace it with "eee". "ec" does not occur at index 2 in s, so we do nothing.
Constraints:
1 <= s.length <= 1000
k == indices.length == sources.length == targets.length
1 <= k <= 100
0 <= indexes[i] < s.length
1 <= sources[i].length, targets[i].length <= 50
s
consists of only lowercase English letters.sources[i]
andtargets[i]
consist of only lowercase English letters.
Ideas:
因为题目已经明确说不会有overlap
1. 利用zip(indices, sources, targets) 去得到(indice, source, target)这样为tuple的array, 再存到一个dictionary里面, key = indice, value = (source, target)
2. 指针i, 如果不在lookup里面加到ans, 往下移; 如果在lookup里面并且source start with s[i:], ans += target; Note: s.startswith(t), 都是lower case 并且有s
Code:
class Solution: def findReplaceString(self, s: str, indices: List[int], sources: List[str], targets: List[str]) -> str: lookup = {i: (src, targ) for i, src, targ in zip(indices, sources, targets)} i, ans = 0, "" while i < len(s): if i in lookup and s[i:].startswith(lookup[i][0]): ans += lookup[i][1] i += len(lookup[i][0]) else: ans += s[i] i += 1 return ans
Code: 针对"abcde" [2,2] ["bc","cde"] ["fe","f"] 这样的use case, 上面的做法不太适用。
class Solution: def findReplaceString(self, s: str, indices: List[int], sources: List[str], targets: List[str]) -> str: mod = list(s) for ind, src, tar in zip(indices, sources, targets): if s.startswith(src, ind): mod[ind] = tar for i in range(ind + 1, ind + len(src)): mod[i] = "" return ''.join(mod)