leetcode647
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,而两头的a与c不相同,因此标记为False。
abcbca —> bcb,此时"左下角"表示的就是内部的字符c,而两头的b与b相同,因此标记为True。
abcbca —> cbc,此时"左下角"表示的就是内部的字符b,而两头的c与c相同,因此标记为True。
abcbca —> bca,此时"左下角"表示的就是内部的字符c,而两头的b与a不相同,因此标记为False。
在此上三角矩阵中(含对角线),所有标记为True的就是一个回文字符,True的个数就是所求。
leetcode647的更多相关文章
- [Swift]LeetCode647. 回文子串 | Palindromic Substrings
Given a string, your task is to count how many palindromic substrings in this string. The substrings ...
- LeetCode 647. 回文子串(Palindromic Substrings)
647. 回文子串 647. Palindromic Substrings 题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符 ...
随机推荐
- mongodb初步使用体验
前言 Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase.笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mo ...
- disjoint set
MAKE-SET.x/ creates a new set whose only member (and thus representative) is x. Since the sets are d ...
- 关于Ble通信库BluetoothKit的使用 以及可能出现的问题分析
首先,这个库是用于BLE(低功耗蓝牙)通信的,地址:https://github.com/dingjikerbo/BluetoothKit 当然,也可以选择根据andorid提供的底层接口自己完成这部 ...
- 剑指Offer 35. 数组中的逆序对 (数组)
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- Linux下不停止服务,清空nohup.out文件
转载:http://www.sucheasy.com/OracleFusionMiddleware/640.html 1.nohup.out的由来及作用 用途:LINUX命令用法,不挂断地运行命令. ...
- 网络编程 生产者消费者模型 GiL
守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...
- jQuery-1.样式篇---属性与样式
jQuery的属性与样式之.attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标 ...
- 第三章泛型集合ArrayList 和Hashtable
第三章泛型集集合 ArrayList 变量名 = new ArrayList(); //相当与一个容器 他的执行using 是 using System.Collections; 变量名.ADD( ...
- python 的 format 函数
python的格式化字符串方法之一------------format 函数 它通过{}和:来代替%. 数字 格式 输出 描述 3.1415926 {:.2f} 3.14 保留小数点后两位 3.141 ...
- 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 ...