给你一个字符串s,他仅由字母a和b组成。每一次删除操作都可以从s中删除一个回文子序列。返回删除给定字符串中所有字符的最小删除次数。
时间: 2023-06-19 18:08:04 浏览: 154
首先,我们可以发现一个回文子序列中,只有两种字符出现,要么是aa,要么是bb。因此,我们可以先统计s中a和b的数量,然后分别考虑只删除a或只删除b的情况。
对于只删除a的情况,我们可以将s中所有的a删除,得到一个新的字符串s',然后判断s'是否为回文字符串,如果是,则说明只需要删除a即可,否则需要删除s'中所有的b,得到一个新的字符串s'',然后判断s''是否为回文字符串,如果是,则说明只需要删除a和b即可,否则说明无法通过只删除a来使得s成为回文字符串。
同理,对于只删除b的情况,我们也可以得到一个新的字符串s''',然后判断s'''是否为回文字符串,如果是,则说明只需要删除b即可,否则需要删除s'''中所有的a,得到一个新的字符串s'''',然后判断s''''是否为回文字符串,如果是,则说明只需要删除a和b即可,否则说明无法通过只删除b来使得s成为回文字符串。
综上所述,我们可以得到一个简单的算法:
1. 统计s中a和b的数量,分别记为na和nb
2. 如果na=0或nb=0,则说明s本身就是回文字符串,无需删除任何字符,直接返回0
3. 否则,分别考虑只删除a和只删除b的情况:
3.1 只删除a的情况:
3.1.1 将s中所有的a删除,得到一个新的字符串s'
3.1.2 如果s'是回文字符串,则返回na
3.1.3 否则,将s'中所有的b删除,得到一个新的字符串s''
3.1.4 如果s''是回文字符串,则返回na+nb,否则返回-1
3.2 只删除b的情况:
3.2.1 将s中所有的b删除,得到一个新的字符串s'''
3.2.2 如果s'''是回文字符串,则返回nb
3.2.3 否则,将s'''中所有的a删除,得到一个新的字符串s''''
3.2.4 如果s''''是回文字符串,则返回na+nb,否则返回-1
4. 如果以上两种情况都无法使得s成为回文字符串,则返回-1
代码如下:
阅读全文