Remove Palindrome SubRemove\ Palindrome\ SubRemove Palindrome Sub
题目描述
给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文子序列。
返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
题目分析
要点
只有’a’和’b’组成的字符串一定含有回文字符串,可得字符串组合仅有“回文字符串”、“回文子序列+回文子序列”和“回文子序列+单个字符”三种。
举例
列举观察
‘aab’→\rightarrow→‘aa’→\rightarrow→‘b’→\rightarrow→’’,
‘aba’→\rightarrow→‘aba’→\rightarrow→’’’,
‘aabb’→\rightarrow→‘aa’→\rightarrow→‘bb’→\rightarrow→’’,
‘aaba’→\rightarrow→‘aba’→\rightarrow→‘a’→\rightarrow→’’,
‘ababb’→\rightarrow→‘aba’→\rightarrow→‘bb’→\rightarrow→’’,
‘abaab’→\rightarrow→‘baab’→\rightarrow→‘a’→\rightarrow→’’,
…
可得知,
1、当原字符串为回文字符串时,只需删除1次,即可得到空字符串。
2、当原字符串为非回文字符串时,只需删除2次,即可得到空字符串。
编程实现
Python3
class Solution:
def removePalindromeSub(self, s: str) -> int:
"""
1、当字符串本身为回文字符串时,只需要删除1次
2、当字符串本身不为回文字符串时,只需要删除2次
"""
return 1 if s == s[::-1] else 2
复杂度分析
- 时间复杂度:O(n)O(n)O(n),其中nnn为字符串长度
- 空间复杂度:O(1)O(1)O(1)
C++
class Solution {
public:
int removePalindromeSub(string s) {
int t = 1;
for(int i=s.length()-1; i >= 0; i--){
if(s[s.length()-1-i] != s[i]){
t = 2;
break;
}
}
return t;
}
};
复杂度分析
- 时间复杂度:O(n)O(n)O(n),其中nnn为字符串长度
- 空间复杂度:O(1)O(1)O(1)
C#
public class Solution {
public int RemovePalindromeSub(string s) {
int t = 1;
for(int i=s.Length-1; i >= 0; i--){
if(s[s.ength-1-i] != s[i]){
t = 2;
break;
}
}
return t;
}
}
复杂度分析
- 时间复杂度:O(n)O(n)O(n),其中nnn为字符串长度
- 空间复杂度:O(1)O(1)O(1)