刷题--回文数

1332. 删除回文子序列

给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文子序列。
返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

示例一:

输入:s = "ababa"
输出:1
解释:字符串本身就是回文序列,只需要删除一次。

示例二:

输入:s = "abb"
输出:2
解释:"abb" -> "bb" -> "". 
先删除回文子序列 "a",然后再删除 "bb"

示例三:

输入:s = "baabb"
输出:2
解释:"baabb" -> "b" -> "". 
先删除回文子序列 "baab",然后再删除 "b"

示例四:

输入:s = ""
输出:0

思路
当输入的字符串string本身为回文字符串时,返回删除次数1;当string不是回文字符串时,由于每次可以删除一个子序列,则删除次数为2;
代码


    int removePalindromeSub(string s) {
        int length = s.length();
        if (length == 0)
        return 0;
        int low = 0,high = length-1;
        while(low<high){
            if (s[low] != s[high])
            return 2;
            low++;
            high--;
        }
        return 1;
    }

本地测试

int main()
{
    string s = "ababa";
    cout<<removePalindromeSub(s)<<endl;
}

输出
在这里插入图片描述

9. 回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例一:

输入: 121
输出: true

示例二:

输入: -121
输出: false
解释: 从左向右读,-121 。 从右向左读,121- 。因此它不是一个回文数。

示例三:

输入: 10
输出: false
解释: 从右向左读,01 。因此它不是一个回文数。

思路

可以通过判断一个数x的前半部分和倒过来看的后半部分是否相等。

代码

class Solution {
public:
    bool isPalindrome(int x) {
        if (x<0 || (x % 10 == 0 && x != 0)){
            return false;
        }
        int reverseNum = 0;
        while(x>reverseNum){
            reverseNum = reverseNum * 10 + x % 10;
            x = x / 10;
        }
        return reverseNum == x || reverseNum / 10 == x;
    }
};

本地测试

int main()
{
    int x1 = 0, x2 = 10, x3 = 121;
    cout << isPalindrome(x1) << '\n' << isPalindrome(x2) << '\n' << isPalindrome(x3) << endl;
}

输出
在这里插入图片描述

409. 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例1:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7

思路

回文字符串的长度L可以是奇数,也可以是偶数。

  • 当 L = 2n+1 时,字符串关于第 n+1 个字符对称,则至多有 n 个字符出现偶数次,至少有一个字符出现奇数次;
  • 当 L = 2n 时,字符串关于中间的界线对称,那么至多有 n 个字符出现偶数次,且没有字符出现奇数次。

代码

int longestPalindrome(string s) {
    int hashmap[52];
    memset(hashmap, 0, sizeof(int) * 52);

    int i, res, odd_mark = 0;
    for (i = 0;i < s.length();i++) {
        char c = s[i];
        if ((c <= 'z') && (c >= 'a'))
            hashmap[int(c - 'a')]++;
        else
            hashmap[int(c) - int('A') + 26]++;
    }
    res = 0;
    for (i = 0;i < 52;i++) {
        res += hashmap[i];
        if (hashmap[i] % 2) {
            res--;
            odd_mark = 1;
        }
    }
    if (odd_mark)
        res++;
    return res;
}

本地测试

int main()
{
    string s = "abccccdda";
    cout << longestPalindrome(s) << endl;
}

输出
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值