【算法分析与设计】【第十四周】647. Palindromic Substrings
2017-12-05 11:27
232 查看
题目来源:674 https://leetcode.com/problems/palindromic-substrings/description/
Palindromic Substrings
题目大意
思路
相关回顾最长回文子串
相关回顾最长回文子序列
本题
解题代码
复杂度
动态规划基础训练。
Example 1:
Input: “abc”
Output: 3
Explanation: Three palindromic strings: “a”, “b”, “c”.
Example 2:
Input: “aaa”
Output: 6
Explanation: Six palindromic strings: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
先区别一下这两个概念:子串和子序列。
子串:XiXi+1Xi+2…Xj-1Xj,为原串的某一连续部分。
子序列:可以为原串的某一不连续部分。
例:
原串:todayisasunnyday
子串:isasunn
子序列:odand
状态转移式:
状态转移式:
Palindromic Substrings
题目大意
思路
相关回顾最长回文子串
相关回顾最长回文子序列
本题
解题代码
复杂度
动态规划基础训练。
647. Palindromic Substrings
题目大意
给定一个字符串,求出该字符串包含的所有回文子串的个数。Example 1:
Input: “abc”
Output: 3
Explanation: Three palindromic strings: “a”, “b”, “c”.
Example 2:
Input: “aaa”
Output: 6
Explanation: Six palindromic strings: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
思路
解这题之前先来复习一下两道相关的题:求最长回文子串和
最长回文子序列。
先区别一下这两个概念:子串和子序列。
子串:XiXi+1Xi+2…Xj-1Xj,为原串的某一连续部分。
子序列:可以为原串的某一不连续部分。
例:
原串:todayisasunnyday
子串:isasunn
子序列:odand
相关回顾:最长回文子串
和最长公共子串本质一致,只需将原串作为X串,原串逆过来作为Y串,进行比较就可以了。
状态转移式:
// x为原字符串,y为原字符串逆置得到的串,f[i][j]表示从x[i]到y[j]之间的最长回文子序列的长度 init:f[i][i] = 1 f[i][j] = f[i-1][j-1] ,x[i]=y[j],i!=j f[i][j] = 0 ,x[i]!=y[j],i!=j result:max{f[i][j]}
相关回顾:最长回文子序列
《算法概论》P179的习题Ex6.7状态转移式:
// str为原字符串,f[i][j]表示从str[i]到str[j]之间的最长回文子序列的长度 init:f[i][i] = 1 f[i][j] = f[i+1][j-1] + 2 ,str[i]=str[j],i!=j f[i][j 4000 ] = max{f[i+1][j], f[i][j-1]} ,str[i]!=str[j],i!=j result:max{f[i][j]}
本题
状态转移式:// str为原字符串,(bool)isPal[i][j]表示从str[i]到str[j]是否是回文 init:isPal[i][i] = true isPal[i][j] = f[i+1][j-1] ,str[i]=str[j],i!=j,i+1<j-1 isPal[i][j] = true ,str[i]=str[j],i!=j,i+1>j-1
解题代码
class Solution { public: int countSubstrings(string s) { int size = s.length(); if (size <= 1) return 1; bool isPal[size][size]; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { isPal[i][j] = false; } } for (int i = 0; i < size; i++) isPal[i][i] = true; int count = size; for (int j = 0; j < size; j++) { for (int i = 0; i < j; i++) { if (s[i] == s[j] && (isPal[i+1][j-1] || i+1 >= j-1) ) { isPal[i][j] = true; count++; } } } return count; } };
复杂度
O(n^2)相关文章推荐
- 算法分析与设计第十四周
- 【算法分析与设计】【第十四周】738. Monotone Increasing Digits
- 算法分析与设计课程作业第十四周#1#2#3
- 第十四周算法分析与设计:Binary Tree Preorder Traversal
- 算法分析与设计——LeetCode:5. Longest Palindromic Substring
- 算法分析与设计——LeetCode Problem.5 Longest Palindromic Substring
- About YUV Video, YUV / RGB 格式分析及快速查表算法设计
- 算法分析与设计——leetcode刷题之Add Two Numbers(Medium)
- 南邮算法分析和实验设计1 分而治之
- [算法分析与设计] leetcode 每周一题: 162. Find Peak Element
- 【广告算法工程师入门 19】机制设计-GFP和GSP下的策略行为与均衡分析
- 算法分析与设计课程作业第一周#1
- 【算法与设计分析基础】大整数乘法int[]版+分治法求幂
- 算法设计与分析-HomeWork
- [算法分析与设计] leetcode 每周一题: Non-overlapping Intervals
- 算法分析与设计——递归算法(一)
- 算法分析与设计——课本8.14
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- 算法分析与设计课程作业第七周#1#2
- [Java算法分析与设计]单向链表(List)的实现和应用