1332-删除回文子序列

Raphael Liu Lv10

给你一个字符串 s,它仅由字母 'a''b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列

返回删除给定字符串中所有字符(字符串为空)的最小删除次数。

「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。

「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 1000
  • s 仅包含字母 'a''b'

方法一:直接判断

由于字符串本身只含有字母 a' 和 b’ 两种字符,题目要求每次删除回文子序列(不一定连续)而使得字符串最终为空。题目中只包含两种不同的字符,由于相同的字符组成的子序列一定是回文子序列,因此最多只需要删除 2 次即可删除所有的字符。删除判断如下:

  • 如果该字符串本身为回文串,此时只需删除 1 次即可,删除次数为 1。
  • 如果该字符串本身不是回文串,此时只需删除 2 次即可,比如可以先删除所有的 a',再删除所有的 b’,删除次数为 2。

代码

[sol1-Python3]
1
2
3
class Solution:
def removePalindromeSub(self, s: str) -> int:
return 1 if s == s[::-1] else 2
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int removePalindromeSub(String s) {
int n = s.length();
for (int i = 0; i < n / 2; ++i) {
if (s.charAt(i) != s.charAt(n - 1 - i)) {
return 2;
}
}
return 1;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int removePalindromeSub(string s) {
int n = s.size();
for (int i = 0; i < n / 2; ++i) {
if (s[i] != s[n - 1 - i]) {
return 2;
}
}
return 1;
}
};
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
public class Solution {
public int RemovePalindromeSub(string s) {
int n = s.Length;
for (int i = 0; i < n / 2; ++i) {
if (s[i] != s[n - 1 - i]) {
return 2;
}
}
return 1;
}
}
[sol1-C]
1
2
3
4
5
6
7
8
9
int removePalindromeSub(char * s) {
int n = strlen(s);
for (int i = 0; i < n / 2; ++i) {
if (s[i] != s[n - 1 - i]) {
return 2;
}
}
return 1;
}
[sol1-Golang]
1
2
3
4
5
6
7
8
func removePalindromeSub(s string) int {
for i, n := 0, len(s); i < n/2; i++ {
if s[i] != s[n-1-i] {
return 2
}
}
return 1
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
var removePalindromeSub = function(s) {
const n = s.length;
for (let i = 0; i < Math.floor(n / 2); ++i) {
if (s[i] !== s[n - 1 - i]) {
return 2;
}
}
return 1;
};

复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串的长度。

  • 空间复杂度:O(1)。

 Comments
On this page
1332-删除回文子序列