leetcode647 迴文子串

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

* 每個字符本身是迴文子串
* 重複字符是迴文子串
image
若當前字符位置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();

}
發佈了28 篇原創文章 · 獲贊 2 · 訪問量 5154
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章