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