【简单】Leetcode-最长回文串///位运算符判断奇偶

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。

示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

思路:对于字符串s中的每个字符c:如果出现个数是偶数个,那么一定可以全部用上,直接加上c的个数如果是奇数个,那么至多可以用个数减1。但是,对于回文串的中心是可以有一个单独的字符的,所以如果有奇数字符的出现,最终结果还要加1。
也就是说如果出现奇数个,可以去掉其中一个,然后用上其余的偶数个。但是正如示例所示,a是可以放在中间的,所以在有奇数个的情况下,最后要加1。

int longestPalindrome(string s) {
        int words[52] = {0};
        int cnt = 0, flag = 0;
        for (char c : s)
        {
            if (isupper(c)) words[c - 'A' + 26]++;
            if (islower(c)) words[c - 'a']++;
        }
        for (int i = 0; i < 52; i++)
        {
            if ((words[i] & 1) && words[i] != 0) cnt += words[i];
            else //即有奇数的情况下
            {
                cnt += words[i] - 1;
                flag = 1;
            }
        }
        return cnt + flag;
    }

总结:这题判断奇偶可以用位运算符&,使程序更快。(注意,用位运算符别忘了括号)
&是位运算,是从bit的角度进行判断,判断奇偶的原因是1的只有第一位是1,其它都是0。所以你拿其它数字跟他进行&运算,它会无视除了第一位的所有位(其它位都变成了0)奇数第一位是1,偶数第一位是0,所以造成了可以判断奇偶的现象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值