力扣题库刷题笔记647-回文子串

1、题目如下:

力扣题库刷题笔记647-回文子串_第1张图片

2、个人Python代码实现

 力扣题库刷题笔记647-回文子串_第2张图片

         思路如下:

        a、以切片的形式,判断每个子字符串是否为回文字符串。这里如何确定切片的起始下标就很重要了

        b、首先需要知道的是字符串s,s[i,j],指的是从下标i开始,到下标s[j-1]为止。例如s = '123456789', s[2,5]指的是下标为2开始,下标4截至,即345。所以进行切片时,在最后的循环中,需要切片到len(s) + 1才行

        c、其次,起始下标相对简单,通过第一个for循环遍历,用i做起始下标

        d、然后确定终止下标,终止下标用第2个for循环,用i+j作为终止下标进行切片。这里让我不断调试的点在于确定第2个for循环的循环次数。首先是,空字符串逆序后也是空字符串,所以需要排除空字符串的干扰,所以i+j一定要大于i,j必须从1开始循环。最后,由于i+j的最大值一定是字符串长度+1(原因见b,这样才能使得在每一次外循环的最后一次循环,切片为s[i:len(s)+1],也就是等价于s[i:])。这一句话可以转移为: i+j的最大值为len(s) + 1,所以内部循环的循环次数就是len(s)+1-i。

        代码如下:

class Solution:

    def countSubstrings(self, s: str) -> int:

        ans = 0                                             #用于输出结果

        for i in range(len(s)):                             #用于确定切片的起始下标

            for j in range(1, len(s)+1-i):                  #用于确定切片的终止下标

                if s[i:i+j] == s[i:i+j][::-1]:              #当切片字符串与其逆序的字符串相同时,就是回文字符串,此时ans+1

                    ans += 1

        return ans

3、知识点:字符串逆序

        这个点我经常会忘记怎么处理,所以这里一并做个笔记。常用的方式如下:

力扣题库刷题笔记647-回文子串_第3张图片

 

你可能感兴趣的:(力扣,leetcode,笔记,算法)