题解 | #牛群密码 - 有效回文# 回文串

牛群密码 - 有效回文

https://www.nowcoder.com/practice/98fad63b47544d5ebf4042fc53b54b3d

知识点

回文字符串 哈希表

思路

首先用哈希表对字符串去重,如果个数大于k则返回false

其次开始判断是否是回文串(有一个容错),如果发现不能相等的时候,应该分别去除掉不相等的那对中的一个字符后再进行正常的回文串判断。

因为只会判断一次,所以时间复杂度是O(n)

注意当出现不一样的时候根据是否和下一个位置是否相等选择一个继续判断回文串的思路是错误的。因为可能存在“abab”这样的字符串,即当出现第一个a和最后一个b不等的时候,把左指针右移和右指针左移都可以继续相等时,不能擅自选一个方向移动。

例如hack数据:

"abccbab",10

"abaccab",10

目前我在时间榜上的代码也是错误的; 但是后续更新牛客无法更新到榜上 很无语

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param password string字符串 
     * @param k int整型 
     * @return bool布尔型
     */
    bool isValidPalindrome(string password, int k) {
        unordered_set<char> S(password.begin(), password.end());
        if (S.size() > k) return false;
        for (int i = 0, j = password.size() - 1; i < j; i ++, j --) {
            if (password[i] == password[j]) continue;
            return check(password, i + 1, j) or check(password, i, j - 1);
        }
        return true;
    }
    bool check(const string& s, int l, int r) {
        if (l > r) return false;
        for (int i = l, j = r; i < j; i ++, j --) {
            if (s[i] != s[j]) return false;
        }
        return true;
    }
};

全部评论

相关推荐

阿武同学:基本信息保留前面三行,其他的可以全部删掉,邮箱最重要的你没写,主修课程精简到8个以内,实习里面2/3/4都是水内容的,非要写的话建议两到三句话,项目经历排版优化下,自我评价缩到三行
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务