回文子串(力扣第647題)

2022-06-16 11:30:10 字數 1004 閱讀 9233

題目

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。

示例

輸入:"abc"

輸出:3

解釋:三個回文子串: "a", "b", "c"

輸入:"aaa"

輸出:6

解釋:6個回文子串: "a", "a", "a", "aa", "aa", "aaa"

分析

​ 因為求的是回文子串的個數,而單個字元構成的子串都可以認為是回文串,所以乙個給定的字串,其最少擁有len(str)個回文子串。同時,如果多個回文子串的字元和順序完全相同,但是其開始位置或者結束位置不同,那麼也不認為這些回文子串是同乙個。

​ 我最先想到的方法是暴力破解,即先定義乙個判斷乙個字串是否是回文串的函式,然後遍歷字串的所有子串逐個判斷。該方法的時間複雜度為o(n!),時間效能和空間效能都不算優秀。

public int countsubstrings(string s) }}

return res;

}private boolean ishui(string s)

return false;

}

​ 為此,需要想出乙個更加優化的演算法來解決這一問題。可以從字串的某乙個字元位置處向外擴充套件,擴充套件的方式分別是奇數擴充套件和偶數擴充套件兩種方式,即分別求奇數長度和偶數長度的回文子串。這樣就能大大縮短查詢時間,時間複雜度為o(nlogn)。

private int cnt = 0;

public int countsubstrings(string s)

return cnt;

}private void extendsubstrings(string s, int start, int end)

}

參考:

題解 - 字串.md#3-字串中單詞的翻轉

LeetCode第647題 回文子串題解(C )

結尾 還是乙個學生,做題解只是個人記錄,有不少錯誤或紕漏之處,還望多多包涵。給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa...

刷題 力扣 647

題目鏈結 題目描述 給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 nums r 1 nums r 就...

力扣 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。我的第一想法是暴力,然後才是中心擴充套件法 雖然知道應該用動態規劃,但是實現不出來 public string longestpalindr...