题目来源
题目描述
题目解析
由于字符串本身只含有字母a
和b
两种字符,题目要求每次删除回文子序列(不一定连续)而使得字符串最终为空。题目中只包含两种不同的字符,由于相同的字符组成的子序列一定是回文子序列,因此最多只需要删除2次就可以删除所有的字符。删除判断如下:
- 如果该字符串为空串,那么返回0
- 如果该字符串本身为回文串,此时只需删除 1次即可,删除次数为 1。
- 如果该字符串本身不是回文串,此时只需删除 2 次即可,比如可以先删除所有的 a,再删除所有的 b,删除次数为 2。
class Solution {
public:
int removePalindromeSub(string s) {
int n = s.size();
if(n == 0){
return 0;
}
for (int i = 0; i < n / 2; ++i) {
if (s[i] != s[n - 1 - i]) {
return 2;
}
}
return 1;
}
};
读懂题目,你就知道了99%
关键点:是回文子序列!!!不是回文子串!!, 比如abbbaaa,那么aaaa也是它的回文子序列
- 回文子序列和回文子串不一样,回文子序列不需要连续,只要求回文。而回文子串需要连续。
- 本串中只有a,b。那么共分为三种情况:
- 如果为空串,0次
- 如果本串为回文串,1次
- 如果本串不为回文,由于所有的a都回文,所有的b都回文。因此最多删除两次,先删除a,再删除b就行。
class Solution {
public:
int removePalindromeSub(string s)
{
int count=0;//用来存储比较的对称元素的相等次数
if(s.size()==0)//排除s为空的情况
{
return 0;
}
for(int i=0;i<s.size()/2;i++)//遍历s,如果s整体为一个回文序列则返回1即可
{
if(s[i]==s[s.size()-i-1])
{
count++;
}
}
if(count==s.size()/2)
{
return 1;
}
else//其他情况返回2即可
{
return 2;
}
}
};
class Solution {
public:
int removePalindromeSub(string s) {
if (s.empty()) return 0;
string tmp = s;
reverse(s.begin(), s.end());
if (s == tmp) return 1;
return 2;
}
};
class Solution {
public int removePalindromeSub(String s) {
if (s.length() == 0 ){
return 0;
}
// 回文序列
if (new StringBuilder(s).reverse().toString().equals(s)){
return 1;
}
// 先删除所有a,再删除所有b
return 2;
}
}