1345 有效快递序列数目
题目:
给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j :
- i + 1 需满足:i + 1 < arr.length
- i - 1 需满足:i - 1 >= 0
- j 需满足:arr[i] == arr[j] 且 i != j
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。 注意: 任何时候你都不能跳到数组外面。
示例 :
输入:arr = [100,-23,-23,404,100,23,23,23,3,404]
输出:3
解释:那你需要跳跃 3 次,下标依次为 0 --> 4 --> 3 --> 9 。下标 9 为数组的最后一个元素的下标。
思路
代码:
class Solution {
public:
int minJumps(vector<int>& w) {
unordered_map<int, vector<int>> hash;
int n = w.size(), INF = 1e9;
for (int i = 0; i < n; i ++)
hash[w[i]].push_back(i);
vector<int> dist(n, INF);
queue<int> q;
dist[0] = 0;
q.push(0);
while (q.size()) {
auto t = q.front();
q.pop();
for (int i = t - 1; i <= t + 1; i += 2) {
if (i >= 0 && i < n && dist[i] > dist[t] + 1) {
dist[i] = dist[t] + 1;
q.push(i);
}
}
int val = w[t];
if (hash.count(val)) {
for (int i : hash[val]) {
if (dist[i] > dist[t] + 1) {
dist[i] = dist[t] + 1;
q.push(i);
}
}
hash.erase(val);
}
}
return dist[n - 1];
}
};
1371 每个元音包含偶数次的最长子字符串
题目:
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。
示例 :
输入:s = "eleetminicoworoep"
输出:13
解释:最长子字符串是 "leetminicowor" ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
思路
代码:
class Solution {
public:
int findTheLongestSubstring(string s) {
vector<int> cnt(32, -2);
string str = "aeiou";
cnt[0] = -1;
int res = 0, state = 0;
for (int i = 0; i < s.size(); i ++) {
int k = str.find(s[i]);
if (k != -1) state ^= 1 << k;
if (cnt[state] != -2) res = max(res, i - cnt[state]);
else cnt[state] = i;
}
return res;
}
};
充电站 推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
|