LeetCode647 Palindromic SubStrings(迴文子串)
阿新 • • 發佈:2021-09-27
題目
Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. Example 1: Input: s = "abc" Output: 3 Explanation: Three palindromic strings: "a", "b", "c". Example 2: Input: s = "aaa" Output: 6 Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa". Constraints: 1 <= s.length <= 1000 s consists of lowercase English letters.
方法
Manacher法
- 時間複雜度:O(n)
- 空間複雜度:O(n)
class Solution { public int countSubstrings(String s) { String s1 = preProcess(s); int length = s1.length(); int c=0,maxR=0,ans=0; int[] p = new int[length]; for(int i=1;i<length-1;i++){ if(i<maxR){ p[i] = Math.min(maxR-i,p[2*c-i]); } int left = i-p[i]; int right = i+p[i]; while(left>=0&&right<length&&s1.charAt(left)==s1.charAt(right)){ left--; right++; p[i]++; } if(maxR<p[i]+i){ maxR = p[i]+i; c = i; } ans += p[i]/2; } return ans; } private String preProcess(String s){ StringBuffer stringBuffer = new StringBuffer("^#"); for (int i=0;i<s.length();i++){ stringBuffer.append(s.charAt(i)+"#"); } stringBuffer.append("$"); return stringBuffer.toString(); } }