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. mongodb初步使用体验

    前言 Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase.笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mo ...

  2. disjoint set

    MAKE-SET.x/ creates a new set whose only member (and thus representative) is x. Since the sets are d ...

  3. 关于Ble通信库BluetoothKit的使用 以及可能出现的问题分析

    首先,这个库是用于BLE(低功耗蓝牙)通信的,地址:https://github.com/dingjikerbo/BluetoothKit 当然,也可以选择根据andorid提供的底层接口自己完成这部 ...

  4. 剑指Offer 35. 数组中的逆序对 (数组)

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  5. Linux下不停止服务,清空nohup.out文件

    转载:http://www.sucheasy.com/OracleFusionMiddleware/640.html 1.nohup.out的由来及作用 用途:LINUX命令用法,不挂断地运行命令. ...

  6. 网络编程 生产者消费者模型 GiL

    守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...

  7. jQuery-1.样式篇---属性与样式

    jQuery的属性与样式之.attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标 ...

  8. 第三章泛型集合ArrayList 和Hashtable

    第三章泛型集集合 ArrayList 变量名 = new ArrayList();  //相当与一个容器 他的执行using 是  using System.Collections; 变量名.ADD( ...

  9. python 的 format 函数

    python的格式化字符串方法之一------------format 函数 它通过{}和:来代替%. 数字 格式 输出 描述 3.1415926 {:.2f} 3.14 保留小数点后两位 3.141 ...

  10. range的新发现

    正向打印的时候 for i in range(2): print(i) 打印的结果 0 1 反向的时候 for i in range(2,-1,-1): print(i) 2 1 0 for i in ...