936. Stamping The Sequence

You are given two strings stamp and target. Initially, there is a string s of length target.length with all s[i] == '?'.

In one turn, you can place stamp over s and replace every letter in the s with the corresponding letter from stamp.

  • For example, if stamp = "abc" and target = "abcba", then s is "?????" initially. In one turn you can:
    • place stamp at index 0 of s to obtain "abc??",
    • place stamp at index 1 of s to obtain "?abc?", or
    • place stamp at index 2 of s to obtain "??abc".
    Note that stamp must be fully contained in the boundaries of s in order to stamp (i.e., you cannot place stamp at index 3 of s).

We want to convert s to target using at most 10 * target.length turns.

Return an array of the index of the left-most letter being stamped at each turn. If we cannot obtain target from s within 10 * target.length turns, return an empty array.

 

Example 1:

Input: stamp = "abc", target = "ababc"
Output: [0,2]
Explanation: Initially s = "?????".
- Place stamp at index 0 to get "abc??".
- Place stamp at index 2 to get "ababc".
[1,0,2] would also be accepted as an answer, as well as some other answers.

Example 2:

Input: stamp = "abca", target = "aabcaca"
Output: [3,0,1]
Explanation: Initially s = "???????".
- Place stamp at index 3 to get "???abca".
- Place stamp at index 0 to get "abcabca".
- Place stamp at index 1 to get "aabcaca".

 

Constraints:

  • 1 <= stamp.length <= target.length <= 1000
  • stamp and target consist of lowercase English letters.
class Solution {
    public int[] movesToStamp(String stamp, String target) {
        char[] s = stamp.toCharArray();
        char[] t = target.toCharArray();
        int sl = s.length;
        int tl = t.length;
        int star = 0;
        List<Integer> pos = new ArrayList();
        boolean[] visited = new boolean[tl];
        
        while(star < tl) {
            boolean replaced = false;
            for(int i = 0; i <= tl - sl; i++) {
                if(!visited[i] && canreplace(s, t, i)) {
                    star = doreplace(t, i, s);
                    visited[i] = true;
                    pos.add(i);
                    replaced = true;
                    if(star == tl) break;
                }
            }
            if(!replaced) return new int[0];
        }
        
        int[] res = new int[pos.size()];
        for(int i = 0; i < pos.size(); i++) {
            res[i] = pos.get(pos.size() - i - 1);
        }
        return res;
    }
    
    public boolean canreplace(char[] s, char[] t, int p) {
        for(int i = 0; i < s.length; i++) {
            if(t[i + p] != '*' && t[i + p] != s[i]) return false;
        }
        return true;
    }
    
    public int doreplace(char[] t, int p, char[] s) {
        int c = 0;
        for(int i = 0; i < s.length; i++) {
            if(t[i + p] != '*') t[i + p] = '*';
        }
        for(char ch : t) {
            if(ch == '*') c++;
        }
        return c;
    }  
}

https://leetcode.com/problems/stamping-the-sequence/discuss/201546/12ms-Java-Solution-Beats-100

Thinking reversely

posted @ 2022-08-22 07:15  Schwifty  阅读(26)  评论(0编辑  收藏  举报