LeetCode 第 32 场双周赛

手速过慢,手感不稳,挂 4 发。

1539.第 k 个缺失的正整数

题目链接:1539.第 k 个缺失的正整数

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k

请你找到这个数组里第 k 个缺失的正整数。

示例 Sample

示例 1:

输入: arr = [2,3,4,7,11], k = 5
输出: 9
解释: 缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。

示例 2:

输入: arr = [1,2,3,4], k = 2
输出: 6
解释: 缺失的正整数包括 [5,6,7,...] 。第 2 个缺失的正整数为 6 。

提示:

  • 1 <= arr.length <= 1000
  • 1 <= arr[i] <= 1000
  • 1 <= k <= 1000
  • 对于所有 1 <= i < j <= arr.lengthij 满足 arr[i] < arr[j]

我的题解

class Solution {
 public:
  int findKthPositive(vector<int>& arr, int k) {
    vector<bool>vis(arr.size() + k + 1);
    for(int i = 0; i < arr.size(); i++)
      if(arr[i] < vis.size())
        vis[arr[i]] = true;
    for(int i = 1, c = 0; i < vis.size(); i++) {
      if(!vis[i])
        c++;
      if(c == k)
        return i;
    }
    return vis.size();
  }
};

1540.K 次操作转变字符串

题目链接:1540.K 次操作转变字符串

给你两个字符串 st ,你的目标是在 k 次操作以内把字符串 s 转变成 t

在第 i 次操作时(1 <= i <= k),你可以选择进行如下操作:

  • 选择字符串 s 中满足 1 <= j <= s.length 且之前未被选过的任意下标 j (下标从 1 开始),并将此位置的字符切换 i 次。
  • 不进行任何操作。

切换 1 次字符的意思是用字母表中该字母的下一个字母替换它(字母表环状接起来,所以 'z' 切换后会变成 'a')。

请记住任意一个下标 j 最多只能被操作 1 次。

如果在不超过 k 次操作内可以把字符串 s 转变成 t ,那么请你返回 true ,否则请你返回 false

示例 Sample

示例 1:

输入: s = "input", t = "ouput", k = 9
输出: true
解释: 第 6 次操作时,我们将 'i' 切换 6 次得到 'o' 。第 7 次操作时,我们将 'n' 切换 7 次得到 'u' 。

示例 2:

输入: s = "abc", t = "bcd", k = 10
输出: false
解释: 我们需要将每个字符切换 1 次才能得到 t 。我们可以在第 1 次操作时将 'a' 切换成 'b' ,但另外 2 个字母在剩余操作中无法再转变为 t 中对应字母。

示例 3:

输入: s = "aab", t = "bbb", k = 27
输出: true
解释: 第 1 次操作时,我们将第一个 'a' 切换 1 次得到 'b' 。在第 27 次操作时,我们将第二个字母 'a' 切换 27 次得到 'b' 。

提示:

  • 1 <= s.length, t.length <= 10^5
  • 0 <= k <= 10^9
  • st 只包含小写英文字母。

我的题解

class Solution {
 public:
  bool canConvertString(string s, string t, int k) {
    if(s.length() != t.length())
      return false;
    map<int, int>vis;
    for(int i = 0, c; i < s.length(); i++) {
      if(s[i] == t[i])
        continue;
      if(s[i] < t[i])
        c = t[i] - s[i];
      else
        c = 26 - s[i] + t[i];
      if(c + vis[c] * 26 > k)
        return false;
      vis[c]++;
    }
    return true;
  }
};

1541.平衡括号字符串的最少插入次数

题目链接:1541.平衡括号字符串的最少插入次数

给你一个括号字符串 s ,它只包含字符 '('')' 。一个括号字符串被称为平衡的当它满足:

  • 任何左括号 '(' 必须对应两个连续的右括号 '))'
  • 左括号 '(' 必须在对应的连续两个右括号 '))' 之前。

比方说 "())""())(())))""(())())))" 都是平衡的, ")()""()))"
"(()))" 都是不平衡的。

你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。

请你返回让 s 平衡的最少插入次数。

示例 Sample

示例 1:

输入: s = "(()))"
输出: 1
解释: 第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "(())))" 。

示例 2:

输入: s = "())"
输出: 0
解释: 字符串已经平衡了。

示例 3:

输入: s = "))())("
输出: 3
解释: 添加 '(' 去匹配最开头的 '))' ,然后添加 '))' 去匹配最后一个 '(' 。

示例 4:

输入: s = "(((((("
输出: 12
解释: 添加 12 个 ')' 得到平衡字符串。

示例 5:

输入: s = ")))))))"
输出: 5
解释: 在字符串开头添加 4 个 '(' 并在结尾添加 1 个 ')' ,字符串变成平衡字符串 "(((())))))))" 。

提示:

  • 1 <= s.length <= 10^5
  • s 只包含 '('')'

我的题解

class Solution {
 public:

  int gao(string &s)const {
    int l(0), r(0);
    for(int i = 0; i < s.length(); i++) {
      if(s[i] == '(')
        l++;
      else if(s[i] == ')') {
        if(l > 0)
          l--;
        else
          r++;
      }
    }
    return 2 * l + r;
  }

  int minInsertions(string s) {
    string t;
    int ans(0);
    for(int i = 0; i < s.length(); i++) {
      t += s[i];
      if(s[i] == ')') {
        if((i + 1 < s.length() && s[i + 1] == ')'))
          i++;
        else
          ans++;
      }
    }
    return ans + gao(t);
  }
};

1542.找出最长的超赞子字符串

题目链接:1542.找出最长的超赞子字符串

给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。

「超赞子字符串」需满足满足下述两个条件:

  • 该字符串是 s 的一个非空子字符串
  • 进行任意次数的字符交换后,该字符串可以变成一个回文字符串

示例 Sample

示例 1:

输入: s = "3242415"
输出: 5
解释: "24241" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "24142"

示例 2:

输入: s = "12345678"
输出: 1

示例 3:

输入: s = "213123"
输出: 6
解释: "213123" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "231132"

示例 4:

输入: s = "00"
输出: 2

提示:

  • 1 <= s.length <= 10^5
  • s 仅由数字组成

我的题解

class Solution {
 public:
  int longestAwesome(string s) const {
    vector<int>a(s.length() + 1, 0);
    vector<int>g((1 << 11), -1);
    for(int i = 0; i < s.length(); i++) {
      a[i + 1] = a[i] ^ (1 << (s[i] - '0'));
    }
    int ans(0);
    for(int i = 0; i <= s.length(); i++) {
      if(g[a[i]] == -1)
        g[a[i]] = i;
      ans = max(ans, i - g[a[i]]);
      int t = a[i];
      for(int j = 0; j < 10; j++) {
        t = a[i] ^ (1 << j);
        if(g[t] != -1)
          ans = max(ans, i - g[t]);
      }
    }

    return ans;
  }
};
posted @ 2020-08-14 10:07  菁芜  阅读(151)  评论(0编辑  收藏  举报