Weekly Contest 184

1408. String Matching in an Array

Given an array of string words. Return all strings in words which is substring of another word in any order. 

String words[i] is substring of words[j], if can be obtained removing some characters to left and/or right side of words[j].

Example 1:

Input: words = ["mass","as","hero","superhero"]
Output: ["as","hero"]
Explanation: "as" is substring of "mass" and "hero" is substring of "superhero".
["hero","as"] is also a valid answer.

Example 2:

Input: words = ["leetcode","et","code"]
Output: ["et","code"]
Explanation: "et", "code" are substring of "leetcode".

Example 3:

Input: words = ["blue","green","bu"]
Output: []

Constraints:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 30
  • words[i] contains only lowercase English letters.
  • It's guaranteed that words[i] will be unique.

Code:

vector<string> Solution::stringMatching(vector<string>& words) {
  vector<string> ans;
  int len = words.size();
  for (int i = 0; i < len; ++i) {
    for (int j = i + 1; j < len; ++j) {
      if (words[i].find(words[j]) != string::npos) {
        ans.push_back(words[j]);
      }
      if (words[j].find(words[i]) != string::npos) {
        ans.push_back(words[i]);
      }
    }
  }
  return ans;
}

1409. Queries on a Permutation With Key

Given the array queries of positive integers between 1 and m, you have to process all queries[i] (from i=0 to i=queries.length-1) according to the following rules:

  • In the beginning, you have the permutation P=[1,2,3,...,m].
  • For the current i, find the position of queries[i] in the permutation P (indexing from 0) and then move this at the beginning of the permutation P. Notice that the position of queries[i] in P is the result for queries[i].

Return an array containing the result for the given queries.

Example 1:

Input: queries = [3,1,2,1], m = 5
Output: [2,1,2,1] 
Explanation: The queries are processed as follow: 
For i=0: queries[i]=3, P=[1,2,3,4,5], position of 3 in P is 2, then we move 3 to the beginning of P resulting in P=[3,1,2,4,5]. 
For i=1: queries[i]=1, P=[3,1,2,4,5], position of 1 in P is 1, then we move 1 to the beginning of P resulting in P=[1,3,2,4,5]. 
For i=2: queries[i]=2, P=[1,3,2,4,5], position of 2 in P is 2, then we move 2 to the beginning of P resulting in P=[2,1,3,4,5]. 
For i=3: queries[i]=1, P=[2,1,3,4,5], position of 1 in P is 1, then we move 1 to the beginning of P resulting in P=[1,2,3,4,5]. 
Therefore, the array containing the result is [2,1,2,1].  

Example 2:

Input: queries = [4,1,2,2], m = 4
Output: [3,1,2,0]

Example 3:

Input: queries = [7,5,5,8,3], m = 8
Output: [6,5,0,7,5]

Constraints:

  • 1 <= m <= 10^3
  • 1 <= queries.length <= m
  • 1 <= queries[i] <= m

Code:

class Solution {
public:
    vector<int> processQueries(vector<int>& queries, int m) {
        vector<int> ans;
        int len = queries.size();
        vector<int> P(m, 0);
        for (int i = 1; i <= m; ++i) {
            P[i-1] = i;
        }
        int pos, temp;
        for (int i = 0; i < len; ++i) {
            for (int j = 0; j < m; ++j) {
                if (P[j] == queries[i]) {
                    pos = j;
                    ans.push_back(j);
                    break;
                }
            }
            temp = P[pos];
            for (int j = pos; j > 0; --j) {
                P[j] = P[j-1]; 
            }
            P[0] = temp;
        }
        return ans;
    }
};

1410. HTML Entity Parser

HTML entity parser is the parser that takes HTML code as input and replace all the entities of the special characters by the characters itself.

The special characters and their entities for HTML are:

  • Quotation Mark: the entity is &quot; and symbol character is ".
  • Single Quote Mark: the entity is &apos; and symbol character is '.
  • Ampersand: the entity is &amp; and symbol character is &.
  • Greater Than Sign: the entity is &gt; and symbol character is >.
  • Less Than Sign: the entity is &lt; and symbol character is <.
  • Slash: the entity is &frasl; and symbol character is /.

Given the input text string to the HTML parser, you have to implement the entity parser.

Return the text after replacing the entities by the special characters.

Example 1:

Input: text = "&amp; is an HTML entity but &ambassador; is not."
Output: "& is an HTML entity but &ambassador; is not."
Explanation: The parser will replace the &amp; entity by &

Example 2:

Input: text = "and I quote: &quot;...&quot;"
Output: "and I quote: "...""

Example 3:

Input: text = "Stay home! Practice on Leetcode :)"
Output: "Stay home! Practice on Leetcode :)"

Example 4:

Input: text = "x &gt; y &amp;&amp; x &lt; y is always false"
Output: "x > y && x < y is always false"

Example 5:

Input: text = "leetcode.com&frasl;problemset&frasl;all"
Output: "leetcode.com/problemset/all"

Constraints:

  • 1 <= text.length <= 10^5
  • The string may contain any possible characters out of all the 256 ASCII characters.

Code:

class Solution {
    public String entityParser(String text) {
        text = text.replace("&quot;", """);
        text = text.replace("&apos;", "'");
        text = text.replace("&amp;", "&");
        text = text.replace("&gt;", ">");
        text = text.replace("&lt;", "<");
        text = text.replace("&frasl;", "/");
        return text;        
    }
}

1411. Number of Ways to Paint N × 3 Grid

You have a grid of size n x 3 and you want to paint each cell of the grid with exactly one of the three colours: Red, Yellow or Green while making sure that no two adjacent cells have the same colour (i.e no two cells that share vertical or horizontal sides have the same colour).

You are given n the number of rows of the grid.

Return the number of ways you can paint this grid. As the answer may grow large, the answer must be computed modulo 10^9 + 7.

Example 1:

Input: n = 1
Output: 12
Explanation: There are 12 possible way to paint the grid as shown:

Example 2:

Input: n = 2
Output: 54

Example 3:

Input: n = 3
Output: 246

Example 4:

Input: n = 7
Output: 106494

Example 5:

Input: n = 5000
Output: 30228214

Constraints:

  • n == grid.length
  • grid[i].length == 3
  • 1 <= n <= 5000

Code:

class Solution {
public:
    int numOfWays(int n) {
        long long case1 = 6, case2 = 6;
        long long temp1, temp2;
        int mod = 1000000007;
        for (int i = 1; i < n; ++i) {
            temp1 = case1 * 3 + case2 * 2;
            temp2 = case1 * 2 + case2 * 2;
            case1 = temp1 % mod;
            case2 = temp2 % mod;
        }
        return (case1 + case2) % mod;
    }
};

思路:

三个方块相邻的颜色不同有两种情况:

case 1: 121, 131, 212, 313, 323, 232(两边颜色相同)

case 2: 123, 132, 213, 231, 312, 321(三个方块有三种不同的颜色)

如果上一行是case 1的话那么接下来的一行满足条件的有(假设上一行是121):

212, 313, 232, 213, 312 (其中前三个属于case 1, 后两个属于case 2)

如果上一行是case 2的话那么接下来的一行满足条件的有(假设上一行是123):

212, 232, 231, 312 (其中前两个属于case 1, 后两个属于case 2)

定义:case1表示上一行是case1的情况,case2表示上一行是case2的情况,则在下一行中

case1 = case1 * 3 + case2 * 2;
case2 = case1 * 2 + case2 * 2;

前两题属于简单题,第三题用C++做可能比较麻烦,如果用Java的话几行就行了。第四题算是一个动态规划的题目比较难。

永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/12686536.html