检查相同字母间的距离
直接每次map距离,最后和dis数组比较
class Solution {
public:
bool checkDistances(string s, vector<int>& distance) {
int len = s.size();
map<char, int> dis;
for(int i = 0; i < len; i++)
{
dis[s[i]] = i - dis[s[i]];
}
for(auto i : dis)
{
if(i.second - 1 != distance[i.first - 'a'])
return false;
}
return true;
}
};
恰好移动 k 步到达某一位置的方法数目
暴力
dp[step][dis]表示走step步,到dis点有多少种方法
在某一点只能像左向右走一步
dp[step][dis] = dp[step - 1][dis - 1] + dp[step - 1][dis + 1]
可能存在负数 将dis加一个定值
class Solution {
public:
const int MOD = 1e9 + 7;
int numberOfWays(int startPos, int endPos, int k) {
vector<vector<long long>>dp(k + 1, vector<long long>(4000));
dp[0][startPos + 1000] = 1;
for(int i = 1; i <= k ; i++)
{
for(int j = startPos - k; j <= startPos + k; j++)
{
dp[i][j + 1000] = dp[i - 1][j + 1000 + 1] + dp[i - 1][j + 1000 - 1];
dp[i][j + 1000] %= MOD;
}
}
return dp[k][endPos + 1000] % MOD;
}
};
最长优雅子数组
双指针 暴力
每次指向最右端值 向左扫 找到最左端
(a & nums[k]) == 0和 a & nums[k] == 0
优先级结合不一样
麻了
//周赛内写的
class Solution {
public:
int longestNiceSubarray(vector<int>& nums) {
int len = nums.size();
int j = 0;
int ans = 1;
while(j < len)
{
int k = j, a = 0;
//错误写法 while(k >= 0 && a & nums[k] == 0)
while(k >= 0 && (a & nums[k]) == 0)
{
a |= nums[k--];
}
ans = max(j - k, ans);
j++;
}
return ans;
}
};
赛后看题解写的其它写法
class Solution {
public:
int longestNiceSubarray(vector<int>& nums) {
int ans = 1, len = nums.size();
for(int i = 0; i < len; i++)
{
int j = i, a = 0;
while(j >= 0 && (a & nums[j]) == 0)
a |= nums[j--];
ans = max(ans, i - j);
}
return ans;
}
};