1332.删除回文子序列 & 219.存在重复元素 II

239 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

1332.删除回文子序列

题目大意

给你一个字符串 s,它仅由字母 'a''b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列

返回删除给定字符串中所有字符(字符串为空)的最小删除次数。

子序列定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。

回文定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

样例

img

数据规模

img

思路

注意数据中有个很重要的条件:ss仅包含字母aabb,并且每次可以删除一个回文子序列。子序列并不是字串,它可以字母之前有间隔。那么就可以保证最多两次可以全部删除:全部删除a,再全部删除b。那么什么时候只需要删除一次呢?当然是字符串本身就是回文串的时候。所以只需要判断字符串是否是回文串,如果是回文串,那么答案为1;否则答案为2。

代码

class Solution {
public:
    int removePalindromeSub(string s) {
        int sign=1;
        for(int i=0;i<s.length();i++){
            if(s[i]!=s[s.length()-i-1]){
                sign=0;
                break;
            }
        }
        return 2-sign;
    }
};

题目

219.存在重复元素 II

题目大意

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 ij ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

样例

img

数据规模

img

思路

设置一个map<int,int>mpmap<int,int>mp标记nums[i]nums[i]出现的上一个位置,初始情况下所有数字的mp[i]=0mp[i]=0,然后遍历numsnums,如果访问到一个num[i]num[i],查看上一次出现的位置mp[nums[i]]mp[nums[i]],如果imp[nums[i]]<=ki-mp[nums[i]]<=k则返回truetrue,否则更新mp[nums[i]]=i+1mp[nums[i]]=i+1,如果始终没有返回truetrue,则说明不存在符合要求的答案,返回falsefalse

代码

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        map<int,int>mp;
        for(int i=0;i<nums.size();i++){
            if(mp[nums[i]]){
                if(i+1-mp[nums[i]]<=k)return true;
            }
            mp[nums[i]]=i+1;
        }
        return false;
    }
};