1. 程式人生 > >LeetCode 647.Palindromic Substrings題解

LeetCode 647.Palindromic Substrings題解

題目

題目要求我們求出一個字串中的迴文字串個數,比如aaa中有a、a、a、aa、aa、aaa六個迴文子串。
原題連結

思路

描述很簡單,好像我們可以直接取所有字串進行判斷就行了,但是這樣的成本太高了,往往暴力解法是不可能完全通過的。
這時候我們可以觀察到,往往一個迴文子串的中心子串也滿足迴文性質。如果一個子串不滿足迴文性質,那麼以它為中心的字串也必定不滿足迴文性質。根據這個性質,我們可以通過原有的迴文子串不斷向外擴張進行判斷,這樣可以減少很多不必要的工作。
示意圖

程式碼實現(Java)

我將情況分為奇數和偶數,只要比較原迴文子串的外邊兩位是否相同即可判斷是不是迴文子串了。

    public
int countSubstrings(String s) { int count = 0; //奇數個操作 for(int i = 0; i < s.length(); i++){ count++; int index = 1; while(i - index >= 0 && i + index < s.length() && s.charAt(i - index) == s.charAt(i + index
) ) { count++; index++; } } //偶數操作 for(int i = 0; i < s.length()-1; i++){ if(s.charAt(i) == s.charAt(i+1)){ count++; int index = 1; while(i - index >= 0 && i + 1
+ index < s.length() && s.charAt(i-index) == s.charAt(i+1+index)) { count++; index++; } } } return count; } public static void main(String[] args) { Solution s = new Solution(); System.out.println(s.countSubstrings("abc")); }

還有大佬沒有分類直接就AC了,利用了整除和取餘,也把程式碼粘上來吧。

class Solution {
    public int countSubstrings(String S) {
        int N = S.length(), ans = 0;
        for (int center = 0; center <= 2*N-1; ++center) {
            int left = center / 2;
            int right = left + center % 2;
            while (left >= 0 && right < N && S.charAt(left) == S.charAt(right)) {
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }
}