LeetCode :647. Palindromic Substrings 回文子串数量

落日映苍穹つ 2021-06-24 16:11 487阅读 0赞

试题
Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1:

Input: “abc”
Output: 3
Explanation: Three palindromic strings: “a”, “b”, “c”.

Example 2:

Input: “aaa”
Output: 6
Explanation: Six palindromic strings: “a”, “a”, “a”, “aa”, “aa”, “aaa”.

Note:

The input string length won’t exceed 1000.

代码
想复杂了,其实这个按中点展开没什么区别。

  1. class Solution {
  2. public int countSubstrings(String s) {
  3. int len = s.length();
  4. char[] ss = s.toCharArray();
  5. int count = 0;
  6. int[][] dp = new int[len][len];
  7. for(int i=0; i<len; i++){
  8. dp[i][i] = 1;
  9. count += 1;
  10. if(i+1<len && ss[i]==ss[i+1]){
  11. dp[i][i+1] = 1;
  12. count ++;
  13. }
  14. }
  15. for(int g=2; g<len; g++){
  16. for(int i=0; i+g<len; i++){
  17. int sta=i, end=i+g;
  18. if(ss[sta]==ss[end] && dp[sta+1][end-1]==1){
  19. dp[sta][end] = 1;
  20. count += 1;
  21. }
  22. }
  23. }
  24. return count;
  25. }
  26. }

中点展开代码:

  1. class Solution {
  2. public int countSubstrings(String S) {
  3. int N = S.length(), ans = 0;
  4. for (int center = 0; center <= 2*N-1; ++center) {
  5. int left = center / 2;
  6. int right = left + center % 2;
  7. while (left >= 0 && right < N && S.charAt(left) == S.charAt(right)) {
  8. ans++;
  9. left--;
  10. right++;
  11. }
  12. }
  13. return ans;
  14. }
  15. }

O(n)代码:

  1. class Solution {
  2. public int countSubstrings(String S) {
  3. char[] A = new char[2 * S.length() + 3];
  4. A[0] = '@';
  5. A[1] = '#';
  6. A[A.length - 1] = '$';
  7. int t = 2;
  8. for (char c: S.toCharArray()) {
  9. A[t++] = c;
  10. A[t++] = '#';
  11. }
  12. int[] Z = new int[A.length];
  13. int center = 0, right = 0;
  14. for (int i = 1; i < Z.length - 1; ++i) {
  15. if (i < right)
  16. Z[i] = Math.min(right - i, Z[2 * center - i]);
  17. while (A[i + Z[i] + 1] == A[i - Z[i] - 1])
  18. Z[i]++;
  19. if (i + Z[i] > right) {
  20. center = i;
  21. right = i + Z[i];
  22. }
  23. }
  24. int ans = 0;
  25. for (int v: Z) ans += (v + 1) / 2;
  26. return ans;
  27. }
  28. }

发表评论

表情:
评论列表 (有 0 条评论,487人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode 647

    题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: