题目描述
给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。
返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
解题思路
由于仅包含两种字符,所以返回值最多为2//即先删除所有’a’,再删除所有‘b’;
接下来考虑比2小的情况:
若为空字符串,则结果为0;
若字符串本身为回文字符串,则结果为1.
代码
class Solution {
public:
/*
** @name: int removePalindromeSub(string s);
** @function:Return the minimum step which we can delete a string by removing a Palindrome substring
** at one step.
*/
int removePalindromeSub(string s) {
int result=0;
size_t length = s.length();
if (length == 0) {
result = 0;
}
else if (isPalindromeSub(s) == true) {
result = 1;
}
else {
result = 2;
}
return result;
}
/*
*@ name: isPalindromeSub(string s)
*@ function:To determine if the string is a Palindrome string
*/
bool isPalindromeSub(string s) {
size_t length = s.length();
bool result = true;
size_t i;
if (length == 0) {
return result;
}
for (i = 0; i <= (length / 2); i++) {
try {
if (s.at(i) != s.at(length - 1 - i)) {
result = false;
break;
}
}
catch (std::out_of_range) {
cout << "Error!i is " << i << " length is " << length << endl;
}
}
return result;
}
};
反思总结
1.首先是审题的时候想当然地把子序列想成了连续的子串…大意失荆州啊
2.最初版本at()未包含在try代码块中,也未对空字符串做额外处理,暴露出自己对于意外处理掌握的不扎实(上上学期和上学期均没好好学orz)