其他分享
首页 > 其他分享> > Leetcode: Find And Replace in String

Leetcode: 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:

0 <= indexes.length = sources.length = targets.length <= 100
0 < indexes[i] < S.length <= 1000
All characters in given inputs are lowercase letters.

HashMap

 1 class Solution {
 2     public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
 3         StringBuilder res = new StringBuilder();
 4 
 5         HashMap<Integer, Integer> map = new HashMap<>();
 6         for (int i = 0; i < indexes.length; i ++) {
 7             map.put(indexes[i], i);
 8         }
 9         
10         for (int i = 0, matchLen = 0; i < S.length(); i += matchLen) {
11             matchLen = 1;
12             
13             if (map.containsKey(i)) {
14                 int p = map.get(i); // p is the index in indexes[]
15                 if (S.startsWith(sources[p], i)) {
16                     res.append(targets[p]);
17                     matchLen = sources[p].length();
18                 }
19                 else res.append(S.charAt(i));
20             }
21             else res.append(S.charAt(i));
22         }
23         return res.toString();
24     }
25 }

 

Sort and replace S from right to left (未深究)

 1     public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
 2         List<int[]> sorted = new ArrayList<>();
 3         for (int i = 0 ; i < indexes.length; i++) sorted.add(new int[]{indexes[i], i});
 4         Collections.sort(sorted, Comparator.comparing(i -> -i[0]));
 5         for (int[] ind: sorted) {
 6             int i = ind[0], j = ind[1];
 7             String s = sources[j], t = targets[j];
 8             if (S.substring(i, i + s.length()).equals(s)) S = S.substring(0, i) + t + S.substring(i + s.length());
 9         }
10         return S;
11     }

 

标签:String,int,indexes,targets,sources,Replace,Leetcode,replacement
来源: https://www.cnblogs.com/EdwardLiu/p/11697731.html