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();
}