647. 回文子串

  算法   3分钟   763浏览   0评论

代码

package com.zou.d1116;

/**
 * @author: 邹祥发
 * @date: 2021/11/16 13:29
 * <p>
 * 647. 回文子串
 * <p>
 * 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
 * 回文字符串 是正着读和倒过来读一样的字符串。
 * 子字符串 是字符串中的由连续字符组成的一个序列。
 * 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
 * <p>
 * 输入:s = "abc"
 * 输出:3
 * 解释:三个回文子串: "a", "b", "c"
 * <p>
 * 输入:s = "aaa"
 * 输出:6
 * 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
 */
public class PalindromeSubstring {
    public static void main(String[] args) {
        String s = "aaa";
        System.out.println(countSubstrings(s));
    }

    public static int countSubstrings(String s) {
        // 中心扩展法
        int ans = 0;
        for (int center = 0; center < 2 * s.length() - 1; center++) {
            // left和right指针和center的关系
            // 首先是left,有一个很明显的2倍关系的存在,其次是right,可能和left指向同一个(偶数时),也可能往后移动一个(奇数)
            // 大致的关系出来了,可以选择带两个特殊例子进去看看是否满足。
            int left = center / 2;
            int right = left + center % 2;

            while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }
}

结果

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论