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.length
的i
和j
满足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 次操作转变字符串
给你两个字符串 s
和 t
,你的目标是在 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
s
和t
只包含小写英文字母。
我的题解
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;
}
};