Leetcode 184周赛题解

前一宿没睡好,困的不行,写的有点慢..

5380. 数组中的字符串匹配

题目描述:

  给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。

题解:

  两次遍历,用kmp判断一下是否是字串。

AC代码:

class Solution {
public:
    int Next[100010];
void getNext(string s)
{
    int i,j;
    i=0;
    j=-1;
    int len=s.length();
    Next[0]=-1;
    while(i<len && j<len)
    {
        if(j==-1 || s[i]==s[j]) Next[++i]=++j;
        else j=Next[j];
    }
}
bool kmp(string m,string s) // s对应子串
{
    getNext(s);
    int i,j;
    i=j=0;
    int mlen=m.length();// i
    int slen=s.length();// j
    while(i<mlen && j<slen)
    {
        if(j==-1 || m[i]==s[j]) i++,j++;
        else j=Next[j];
    }
    if(j==slen) return true;
    return false;
}
    vector<string> stringMatching(vector<string>& words) {
        vector<string> ans;
        int Len = words.size();
        if(Len == 0) return {};
        for(int i=0;i<Len;i++)
        {
            for(int j=0;j<Len;j++)
            {
                if(i == j) continue;
                if(kmp(words[j],words[i]))
                {
                    ans.push_back(words[i]);
                    break;
                }
            }
        }
        return ans;
    }
};

5381. 查询带键的排列

题目描述:

  给你一个待查数组 queries ,数组中的元素为 1 到 m 之间的正整数。 请你根据以下规则处理所有待查项 queries[i](从 i=0 到 i=queries.length-1):

  • 一开始,排列 P=[1,2,3,...,m]
  • 对于当前的 i ,请你找出待查项 queries[i] 在排列 P 中的位置(下标从 0 开始),然后将其从原位置移动到排列 P 的起始位置(即下标为 0 处)。注意, queries[i] 在 P 中的位置就是 queries[i] 的查询结果。

  请你以数组形式返回待查数组  queries 的查询结果。

题解:暴力模拟

class Solution {
public:
    vector<int> processQueries(vector<int>& queries, int m) {
        vector<int> p;
        for(int i=1;i<=m;i++) p.push_back(i);
        vector<int> ans;
        for(auto & que:queries)
        {
            auto pos = p.begin();
            int cnt = 0;
            while(pos != p.end())
            {
                if(*pos == que) break;
                pos++;
                cnt++;
            }
            ans.push_back(cnt);

            p.erase(pos);
            p.insert(p.begin(),que);

        }
        return ans;
    }
};

5382. HTML 实体解析器

题目描述:

「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。HTML 里这些特殊字符和它们对应的字符实体包括:

  • 双引号:字符实体为 &quot; ,对应的字符是 " 。
  • 单引号:字符实体为 &apos; ,对应的字符是  。
  • 与符号:字符实体为 &amp; ,对应对的字符是 & 。
  • 大于号:字符实体为 &gt; ,对应的字符是 > 。
  • 小于号:字符实体为 &lt; ,对应的字符是 < 。
  • 斜线号:字符实体为 &frasl; ,对应的字符是 / 。

给你输入字符串 text ,请你实现一个 HTML 实体解析器,返回解析器解析后的结果。

题解:

  根据&判断是否开始替换,用map存一下映射关系就好了。

AC代码:

class Solution {
public:
    string entityParser(string text) {
        map<string,string> mp;
        mp["&quot;"] = "\"";
        mp["&apos;"] = "‘";
        mp["&amp;"] = "&";
        mp["&gt;"] = ">";
        mp["&lt;"] = "<";
        mp["&frasl;"] = "/";
        int Len = text.length();
        string ans;
        for(int i=0;i<Len;)
        {
            if(text[i] == ‘&‘)
            {
                string tmp = "&";
                i++;
                while(i<Len && mp.find(tmp) == mp.end())
                {
                    if(text[i] == ‘&‘) break;
                    tmp += text[i];

                    i++;
                }
                // if(i<Len && text[i] != ‘&‘) i++;
                if(mp.find(tmp) != mp.end()) ans+=mp[tmp];
                else ans += tmp;
                // cout << tmp << endl;
            }
            else
            {
                ans += text[i];
                i++;
            }

        }
        return ans;
    }
};

5383. 给 N x 3 网格图涂色的方案数

题目描述:

  你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。给你网格图的行数 n 。请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。

题解:

  这个就比较烦了,我用的是dp。先看下图(当n=1的时候):

  从左到右,从上到下依次编号,那么一共有12个状态。定义一个二维$dp[i][j]$,表示第$i$个$grid$为状态$j$的时候有多少种涂色方法。状态转移比较麻烦,我举个例子

$dp[i][0] =  (dp[i-1][1]%mod + dp[i-1][2]%mod + dp[i-1][4]%mod + dp[i-1][5]%mod + dp[i-1][10]%mod)%mod; $当第$i$个$gird$状态为$0$的时候,第$i-1$个grid合法的状态为$1,2,4,5,10$(根据题目推一下就好了)

AC代码:

class Solution {
public:
    int numOfWays(int n) {
        long long  dp[n+1][12];
        memset(dp,0,sizeof(dp));
        long long mod = 1000000007;
        for(int i=0;i<12;i++) dp[1][i] = 1;
        for(int i=2;i<=n;i++)
        {
            dp[i][0] = (dp[i-1][1]%mod + dp[i-1][2]%mod + dp[i-1][4]%mod +  dp[i-1][5]%mod + dp[i-1][10]%mod)%mod;
            dp[i][3] = (dp[i-1][1]%mod + dp[i-1][2]%mod + dp[i-1][7]%mod + dp[i-1][10]%mod)%mod;
            dp[i][6] = (dp[i-1][1]%mod + dp[i-1][2]%mod + dp[i-1][4]%mod +  dp[i-1][5]%mod + dp[i-1][11]%mod)%mod;
            dp[i][9] = (dp[i-1][4]%mod + dp[i-1][5]%mod + dp[i-1][8]%mod +  dp[i-1][11]%mod)%mod;

            dp[i][1] = (dp[i-1][0]%mod + dp[i-1][3]%mod + dp[i-1][6]%mod + dp[i-1][8]%mod +dp[i-1][11]%mod)%mod;
            dp[i][4] = (dp[i-1][0]%mod + dp[i-1][6]%mod + dp[i-1][9]%mod +dp[i-1][8]%mod)%mod;
            dp[i][7] = (dp[i-1][3]%mod + dp[i-1][2]%mod + dp[i-1][5]%mod +dp[i-1][11]%mod)%mod;
            dp[i][10] = (dp[i-1][0]%mod +dp[i-1][3]%mod + dp[i-1][5]%mod + dp[i-1][8]%mod +dp[i-1][11]%mod)%mod;

            dp[i][2] = (dp[i-1][0]%mod +dp[i-1][3]%mod + dp[i-1][6]%mod + dp[i-1][7]%mod)%mod;
            dp[i][5] = (dp[i-1][0]%mod +dp[i-1][6]%mod + dp[i-1][7]%mod + dp[i-1][9]%mod +dp[i-1][10]%mod)%mod;
            dp[i][8] = (dp[i-1][1]%mod +dp[i-1][4]%mod + dp[i-1][9]%mod + dp[i-1][10]%mod)%mod;
            dp[i][11] = (dp[i-1][1]%mod +dp[i-1][6]%mod + dp[i-1][7]%mod + dp[i-1][9]%mod +dp[i-1][10]%mod)%mod;
        }
        long long ans = 0;
        for(int i=0;i<12;i++)
        {
            ans = (ans + dp[n][i])%mod;
        }
        return ans;
    }
};

困的一批..下午出去休息一下 这破状态

原文地址:https://www.cnblogs.com/z1141000271/p/12684504.html

时间: 2024-11-08 19:37:24

Leetcode 184周赛题解的相关文章

LeetCode 171周赛题解

1317. 将整数转换为两个无零整数的和 1 class Solution { 2 public: 3 bool check(int n){ 4 while(n){ 5 if(n%10==0){ 6 return false; 7 } 8 n=n/10; 9 } 10 return true; 11 } 12 vector<int> getNoZeroIntegers(int n) { 13 for(int i=1;i<=n;i++){ 14 if(check(i)&&c

Leetcode 第174场周赛 题解

Leetcode 第174场周赛 题解 方阵中战斗力最弱的 K 行 签到题,统计一下每行的军人数量,然后设置一下排序规则即可. 时间复杂度 \(O(nlogn)\) typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i --) #define INF 0x3f3f3f3f3f3f3f3

Leetcode 第175场周赛 题解(完结)

Leetcode 第175场周赛 题解 检查整数及其两倍数是否存在 数据范围小的可怜,\(O(n^2)\) 解法可行.如果范围大一点,可以先进行排序然后遍历每一个数进行二分查找,时间复杂度 \(O(nlogn)\) 代码是平方解法. typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i

LeetCode: Permutation Sequcence 题解

The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order,We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312" "3

LeetCode: Sort Colors 题解

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and bl

LeetCode: Triangle 题解

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is 11 (i

LeetCode: Two Sum 题解

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

LeetCode: Generate Parentheses 题解

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 题解: 很容易

LeetCode:Combinations 题解

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]DFS,递归 1 class Solution { 2 public: 3 vector<vector<int> > an