leetcode647 回文子串
1.题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例:
输入: “aaaba”
输出: 9
解释:”a”、”aa”、”a”、”aa”、”aaa”、”a”、”b”、”aba”、”a”
2.思路
奇回文(如 aba)和偶回文(如abba)归一化处理
- 在字符串s的前端添加 $** 字符防止越界(代码中有说明越界点),字符串s尾端已有 ‘\0’**
- 添加#字符于字符串s各字符之间
如abacddc
| i | 0 | 1 | 2 | 3 | 4 | 7 |
|---|---|---|---|---|---|---|
| s[i] | a | a | a | b | a | \0 |
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| s_new[i] | $ | # | a | # | a | # | a | # | b | # | a | # | \0 |
* 每个字符本身是回文子串
* 重复字符是回文子串
若当前字符位置i后有重复字符,则以i后一位“#”字符为中心的回文子串包含i位置开始的有重复字符的子串.
3.代码
int countSubstrings(string s) {
if (s.length() == 0)
return 0;
int len_res = 0;
string new_s = "$#";
for (int i = 0; i < s.length(); i++)
{
new_s += s[i];
new_s += "#";
}
for (int i = 1; i < new_s.length(); i++){
int p = 1;
while (new_s[i-p] == new_s[i+p]) {
p++;
}
len_res += (p - 1) / 2;
}
return len_res + s.length();
}

该博客介绍了如何解决LeetCode第647题,即计算字符串中的回文子串个数。作者讲解了奇回文和偶回文的概念,并提供了解决方案,通过在字符串前后添加特殊字符并插入分隔符来简化问题,从而避免边界问题,使得每个字符和重复字符组成的子串都被视为不同的回文子串。

5248

被折叠的 条评论
为什么被折叠?



