给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
回文字符串的概念已经明白,回文字符串的长度分为两种(奇数偶数)。
class Solution {
public:
int countSubstrings(string s) {
int cnt = 0;
for(int i = 0;i < s.size(); i++)
{
cnt += excend(s, i, i, s.size());
cnt += excend(s, i, i+1, s.size());
}
return cnt;
}
int excend(string s, int i,int j,int n)
{
int cnt = 0;
while(i >=0 && j < n && s[i] == s[j])
{
i--;
j++;
cnt++;
}
return cnt;
}
};
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
输入:s = "cbbd"
输出:"bb"
有了上一道题的基础,这道题写的就游刃有余了,一开始想着,可以讲所有回文字符串存放到一个数组中,但是截取字符串时间复杂度为O(N),可能会超时,就用两个数据left、right代替回文字符串的左右端,如果新的回文子串长度大于right - left的长度,更新left、right。
class Solution {
int left = 0;
int right = 0;
public:
string longestPalindrome(string s) {
for(int i = 0 ;i < s.size();i++)
{
excend(s,i,i,s.size());
excend(s,i,i+1,s.size());
}
return s.substr(left,right-left+1);
}
void excend(string s, int i,int j,int n)
{
int cnt = 0;
while(i >=0 && j < n && s[i] == s[j])
{
if(j - i > right - left)
{
right = j;
left = i;
}
i--;
j++;
}
}
};
做了第一道题回文子串,再写最长回文子串更简单,这种题还有一种dp写法,在这里就不描述了。
更多资料点击 GitHub 欢迎各位读者去Star
⭐学术交流群Q 754410389 持续更新中~~~