class Solution {
public:
bool ifHuiWen(bool DP[][],int i,int j){
if(i>=j){
return true;
}
else{
return DP[i][j];
}
} int countSubstrings(string s) {
int n=s.length();
if(n==){
return ;
}
int count=;
bool DP[][];
for(int i=;i<n;i++){
DP[i][i]=true;
}
count+=n;
for(int len=;len<n;len++){
for(int i=;i<n-len;i++){
int j=i+len;
if(s[i]!=s[j]){
DP[i][j]=false;
}
else{
DP[i][j]=ifHuiWen(DP,i+,j-);
if(DP[i][j]){
count++;
}
}
}
} return count;
}
};

参考另外一个python的实现,解释的比较容易懂,代码思路和上面的是一样的。

 def countSubstrings(self, s):
if not s:
return 0 n = len(s)
table = [[False for x in range(n)] for y in range(n)]
count = 0 # Every isolated char is a palindrome
for i in range(n):
table[i][i] = True
count += 1 # Check for a window of size 2
for i in range(n-1):
if s[i] == s[i+1]:
table[i][i+1] = True
count += 1 # Check windows of size 3 and more
for k in range(3, n+1):
for i in range(n-k+1):
j = i+k-1
if table[i+1][j-1] and s[i] == s[j]:
table[i][j] = True
count += 1 return count

定义二维数组,table进行动态规划的记录。table[i][j]表示字符串s中,下标i到下标j之间的字符是否是回文字符,true表示:是回文;false表示:不是回文。

10~12行,第一次循环,将对角线上元素进行标记,全部标记为True,因为每一个单独字符都可以当作一个回文字符。

15~18行,第二次循环,将蓝色斜线进行标记,判断连续的两个字符是否相同,如果相同标记为True,否则标记为Flase。

12~26行,第三次循环,将剩下的橘色,品红和红色等进行标记,k的取值范围是从3到n,本例中n等于5。

k==3时,标记橘色,当其左下角位置为True,并且i元素和j元素字符相同(i与j相差2个位置,即i为0时j为2,i为1时j为3...以此类推)

k==4时,标记品红,当其左下角位置为True,并且i元素和j元素字符相同(i与j相差3个位置,即i为0时j为3,i为1时j为4...以此类推)

k==5时,标记红色,当期左下角位置为Ture,并且i元素和j元素字符相同(i与j相差4个位置,即i为0时j为4,以此类推)

这里的"左下角"表示:当前长度为k的子字符串,除去第0位和第k-1位后,"内部"的字符串是否是回文。

例如:s='abcbca',假设此时k=3,则会分别依次判断:

abcbca —> abc,此时"左下角"表示的就是内部的字符b,而两头的ac不相同,因此标记为False。

abcbca —> bcb,此时"左下角"表示的就是内部的字符c,而两头的bb相同,因此标记为True。

abcbca —> cbc,此时"左下角"表示的就是内部的字符b,而两头的cc相同,因此标记为True。

abcbca —> bca,此时"左下角"表示的就是内部的字符c,而两头的ba不相同,因此标记为False。

在此上三角矩阵中(含对角线),所有标记为True的就是一个回文字符,True的个数就是所求。

参考:https://leetcode.com/problems/palindromic-substrings/discuss/128581/Easy-to-understand-Python-DP-solution

leetcode647的更多相关文章

  1. [Swift]LeetCode647. 回文子串 | Palindromic Substrings

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

  2. LeetCode 647. 回文子串(Palindromic Substrings)

    647. 回文子串 647. Palindromic Substrings 题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符 ...

随机推荐

  1. JavaScript之循环

    我是昨天的小尾巴...https://blog.csdn.net/weixin_42217154/article/details/81182817 3.2 循环结构 循环结构是指在程序中需要反复执行某 ...

  2. SpringBoot(四)thymeleaf+MyBatis+MySql

    接着上一节 1.第一步:在pom文件中添加 <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.bo ...

  3. 本地sh脚本创建以及利用ssh server远程运行sh脚本

    想要同时运行多个非本地的sh脚本,用来实现运行同一网段下多机程序的集成,可以通过在每台机器上写sh脚本,再在本机上运行一个启动远程机器sh的脚本 首先需要在所有机器上安装openssh-server ...

  4. nginx配置socket服务

    1.服务器环境:centos7.5 2.安装nginx 首先下载:wget http://nginx.org/download/nginx-1.14.0.tar.gz 解压:tar zxvf  ngi ...

  5. 1.6 selenium3+firefox环境搭建

    1.6 selenium3+firefox环境搭建 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的.(备注:这里 ...

  6. 【leetcode】455. Assign Cookies

    problem 455. Assign Cookies solution1: But, you should give each child at most one cookie. 对小朋友的满意程度 ...

  7. 文本对齐方式(text-align)

    text-align 设置元素内文本的水平对齐方式. 属性值:left.right.center.justify 注:该属性对块级元素设置有效.

  8. python中datetime常用方法

    # 可运算的时间方法包 >>> import datetime >>> import time >>> res = datetime.dateti ...

  9. java.net.BindException: Address already in use: JVM_Bind:80 异常的解决办法

    今天遇见了这个端口被占用问题 然后各种百度 先是说 用命令 netstat -a -n -o 最后一个选项表示连接所在进程id. 找到8080端口的PID然后打开任务管理器, 切换到进程选项卡, 在菜 ...

  10. 常见模块(二) logging模块

    logging模块是专门做日志系统的.分为函数版和自定义函数. (一)logging模块初级版 缺点,不能指定字符集,不能把屏幕输出和文件日志同时记录.只能选择其一. 文件记录日志 import lo ...