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;
}
输出