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 题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符 ...
随机推荐
- postman操作练习用例
1.注册用户:http://api.nnzhp.cn/api/user/user_reg 2.登录用户:http://api.nnzhp.cn/api/user/login 3.添加学生:http:/ ...
- setTimeout中调用this
项目案例: 左右切换tab容器的动作,封装到一个对象中: var slidingComp = { startX : 0 , moveX : 0 , ...... start : function(e) ...
- php源码学习——开篇
这个系列是对php源码的学习记录.由于本人水平有限,可能并不能写的非常清晰和深入,所以,可能只适合本人阅读:) 初次接触php源码,看到陌生的文件夹和大量的文件,可能会觉得茫然无措.php-inter ...
- datatables 行与列的数据获取
datatables官网: https://datatables.net/reference/api/cells() 获取数据的方式如下 var table = $(selector).DataTab ...
- 剑指Offer 39. 平衡二叉树 (二叉树)
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 题目地址 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222 ...
- 【oracle入门】Oracle数据库11g企业版主要优点
高可靠性.能够尽可能地放置服务器故障.站点故障和人为错误的发生. 高安全信息.可以利用行级安全性.细粒度审计.透明的数据加密和数据的全面会议确保数据安全和遵守法规. 更好的数据管理.轻松管理最大型数据 ...
- mission 01
A.自己目前在专业能力上的短板,及打算如何弥补. answer:由于在课本中所学的知识是死板的,加上不知如何课外提高自己在专业上的实践应用能力,所以我认为我在专业能力上的短板是缺乏将所掌握的知识应用到 ...
- Windows 下 安装 laravel(一些小笔记)
首先 安装完composer 下载地址 https://getcomposer.org/ 在 cmd 进入到 自己的项目访问目录 然后 输入命令:composer creat ...
- Centos7 firewall开放3306端口
目录 Centos7 firewall开放3306端口 1. 查看防火墙状态 2. 关闭防火墙firewall 3. 关闭防火墙firewall后开启 4. 开启端口 5. 重启防火墙 6. 常用命令 ...
- 关于C语言实现判断给定一个数,判断其是否是一个质数(素数)。
Annotation:⒈我们需要明确0,1既不是质数,又不是合数.⒉其次我们需要知道一个质数,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数.(自然数:自然数用以计量事物的件数或表示事 ...