目录
一,判断是否回文
leetcode 125
1,双指针:左右指针分别向中间移动并判断字符相等。最后判断左大于等于右。O(n), O(1)
bool IsPalinDrome(const string &str)
{ if (str.size() == 0) { // (1)
return false;
}
int start = 0;
int end = str.size() - 1; // (2)注意这里最好不要用size_t类型. 因为若没写(1), 空串时会整数会反转
while (start < end && str[start] == str[end]) {
start++;
end--;
}
return start >= end;
}
2,reverse:反转字符串并与原串判断串相等。O(n), O(n)需额外空间
3,栈:字符串左半边顺序入栈。之后分别出栈并与右半边判断字符相等。O(n), O(n)需额外空间
二,最长回文子串
leetcode5
1,中心扩展法(暴力枚举)
遍历,以每个元素为中间元素,同时向左右出发找回文串,对每轮找到的更长的回文串记录左右边界,最终使用substr提取子串。
注意:回文串有两种:"aabaa"和"aabbaa",所以每轮的中心点用为(i, i)和 (i, i + 1)分别找回文串。CenterExpandValid入参的left,right就是中心点。
class Solution {
public:
string longestPalindrome(string s)
{
int sLength = s.size();
if (sLength == 0) {
return "";
}
int start = 0;
int end = 0;
int maxLen = 0;
int len = 0;
string result;
for (int i = 0; i < sLength; i++) {
int len1 = CenterExpandValid(s, sLength, i, i);
int len2 = CenterExpandValid(s, sLength, i, i + 1);
len = max(len1, len2);
if (len > maxLen) {
maxLen = len;
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
result = s.substr(start, maxLen);
return result;
}
int CenterExpandValid(string& s, int sLength, int left, int right)
{
while (left >= 0 && right < sLength && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
};
三,分割回文串
leetcode131. 分割回文串
回溯之排列:子串满足某条件:
重点是确定候选集。是通过substr来获取s.substr(start, i - start +1)长度的子串作为候选集的一个元素。