• 题目一:最长连续回文子串。

    •   问题分析:回文串顾名思义表示前后读起来都是一样,这里面又是需要连续的。分析这个问题的结构,可以想到多种方法。暴力解决的方式,2层循环遍历得出各个子串,然后再去判断该子串是否回文,这样的话O(N)=n的三次方,还有一种是dp解决。
    •   解题方法一:暴力解决的方法。前面已经讲到了方法,下面给出方法的实现。
      1. class Solution {
      2. public:
      3. string longestPalindrome(string s) {
      4. int maxlength = ;
      5. int start = , end = ;
      6. for (int i=; i<s.size(); i++){
      7. for (int j=i+; j<s.size(); j++){
      8. int temp1, temp2;
      9. for (temp1=i, temp2=j; temp1<temp2; temp1++, temp2--){
      10. if (s[temp1] != s[temp2])
      11. break;
      12. }
      13. if (temp1>=temp2 && j-i>maxlength){
      14. maxlength = j-i+;
      15. start = i;
      16. end = j;
      17. }
      18. }
      19. }
      20. if (maxlength > )
      21. s.substr(start, maxlength);
      22. return NULL;
      23. }
      24.  
      25. };
    •   解题方法二:DP求解。为什么会想到dp求解呢。首先分析问题。最长连续子串是否回文。如果一个子串回文,那么子串的子串也就是回文的,依次类推就简化为一个小的解,从而得到整体的解。
           具体思路:设置一个int二维数组DP[i][j]用来存储从i到j的串是否回文,1表示是,0表示否。
                         这里有三种情况需要考虑:①:当只有一个字符的时候,i=j,肯定回文   DP[i][j] = 1;
                                                       ②:当两个两个字符相邻的时候,如果他们相等,那么他们也是回文的,i-j<2 && s[i]==s[j]  -> DP[i][j] = 1
                                                          ③:当超过两个字符的时候,如果他们首尾是相同的并且除去首尾字符的剩余字符也是回文的话,那么这个串也是回文的。
                                                                s[i] == s[j] && DP[i+1][j-1] = 1  ->DP[i][j] = 1
                         考虑完这三种情况,就设置两个指针记录最长回文子串的左右位置,然后直接提取出来即可。DP[i][j] = 1 并且最长字符长度小于当前字符长度。
      1. class Solution {
      2. public:
      3. string longestPalindrome(string s) {
      4. int dp[s.size()][s.size()] ;
      5. int left = , right = , maxlength = ;
      6. for (int i=; i<s.size(); i++){
      7. for (int j=; j<i; j++){
      8. //这里表示出了所有的情况
      9. //当为相邻两个字符串时,如果相等则为1,当大于两个字符串时,如果首尾相同并且子串是回文的话,那么这个串也是回文
      10. dp[j][i] = (s[i] == s[j] && ((i-j < ) || dp[j+][i-]));
      11. if (dp[j][i] && maxlength< i-j+) {
      12. maxlength = j-i+;
      13. left = j;
      14. right = i;
      15. }
      16. }
      17. dp[i][i] = ;//这里表示单个字符串就是回文串。
      18. }
      19. return s.substr(left, right-left+);
      20. }
      21. };
  • 题目二:给出一个整数,判断这个整数是否是回文数字,不能使用额外的存储空间,意思是不能将他变为字符串。
    •   题目分析:第一想到的就是将他变成一个字符串然后对他进行判断是否是回文串。但是题目不能变为字符串。这里我们就可以变换一种方法。比如对数字“12321”,12321/10000=1,首位为1, 12321%10=1,尾部为1,然后继续判断232这个数字,按照相同的方法(这里的关键是剩余数字的位数需要确定)
    • 代码:
      1. class Solution {
      2. public:
      3. bool isPalindrome(int x) {
      4. if (x < )
      5. return false;
      6. int flag = ;
      7. while(x/flag >= ){//求整数的最高位 -》这是求最高位的位数的技巧
      8. flag *= ;
      9. }
      10. while (x) {
      11. int left = -, right = -;
      12. left = x/flag;
      13. right = x%;
      14. if (left != right)
      15. return false;
      16. x = (x%flag)/;
      17. flag = flag/;
      18. }
      19. return true;
      20. }
      21. };
  • 题目三:判断一个字符串是否是回文,只考虑字母和数字,其他空格之类的忽略。
    •   思路:这个就是简答的判断字符串是否是回文的情况。碰到不是字母或者是数字的情况直接跳转到下一个字符串,头尾依次进行比较。这里需要考虑大小写的问题,所以比较是否相同直接利用assic的值进行比较比较合适。s[left] +32 -'a')%32 !=  (s[right] +32 -'a')%32  ->>这里%32表示大小写的assic 32是一个循环。
    • 代码
      1. class Solution {
      2. public:
      3. bool isPalindrome(string s) {
      4. int len = s.size();
      5. int left = , right = len-;
      6. while (left < right){
      7. if (!isAlphaNum(s[left]))
      8. left++;
      9. else if (!isAlphaNum(s[right]))
      10. right--;
      11. else if((s[left] + -'a')% != (s[right] + -'a')%)
      12. return false;//这里考虑到大小写,所以直接这样用assic进行比较
      13. else{
      14. left++,right--;
      15. }
      16. }
      17. return true;
      18. }
      19. bool isAlphaNum(char &ch) {
      20. if (ch >= 'a' && ch <= 'z') return true;
      21. if (ch >= 'A' && ch <= 'Z') return true;
      22. if (ch >= '' && ch <= '') return true;
      23. return false;
      24. }
      25. };
  • 题目四:
    1. 给定一个字符串s,分区s使得分区的每个子字符串是一个回文。
    2.  
    3. 返回s的所有可能的回文分区。
    4.  
    5. 例如,给定s =“aab”,
    6. 返回
    7.  
    8. [
    9. [“aa”,“b”],
    10. [“a”,“a”,“b”]
    11. ]]
    •   题目分析:实际上这道题目是一道组合的题目,对付组合的题目,回溯法是一个很好的方法。这里是要拆分字符串(拆分的串都是回文串),得出所有的拆分情况。组合问题->回溯法,DFS算法很好的解决了这个问题。先是针对一个一个字符进行拆分,然后是针对两个字符是回文串的串,之后是含有三个字符是回文串的字符,依次类推(这里需要一个函数是判断该字符串是否为回文的函数,给定首尾进行判断)。dfs递归的条件是找到符合要求的回文串,然后对后面的串也进行递归的求解(从头开始继续进行递归求解)
    •   实例分析:
      a b c e e  -> 第一组:a 回文  a进temp, b回文 b进temp, c 回文 c进temp  , e 回文 e进temp ,  e 回文 e进temp找到一组,出容器。
                         第二组:回溯,回溯到第一个e,进行两个字符回文查找判断,找到ee,之后就没有了。
    • 代码:
      1. class Solution {
      2. public:
      3. vector<vector<string>> partition(string s) {
      4. vector<vector<string> > res;
      5. vector<string> temp;
      6. partition(s, , temp, res);
      7. return res;
      8. }
      9. void partition(string &s, int start, vector<string> temp, vector<vector<string> > &res){
      10. int len = s.size();
      11. if (start == len)
      12. res.push_back(temp);
      13. for (int i=start; i<len; i++){
      14. if (isPalindromeStr(s, start, i)){
      15. temp.push_back(s.substr(start, i-start+));
      16. partition(s, i+, temp, res);
      17. temp.pop_back();
      18. }
      19. }
      20. }
      21. bool isPalindromeStr(string s, int start, int end){
      22. while (start < end){
      23. if (s[start] != s[end]){
      24. return false;
      25. }else
      26. start++,end--;
      27. }
      28. return true;
      29. }
      30. };

(回文串)leetcode各种回文串问题的更多相关文章

  1. 125. 验证回文串--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/valid-palindrome 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. ...

  2. [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

  3. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

  4. leetcode 1.回文数-(easy)

    2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...

  5. 最长回文子序列/最长回文子串(DP,马拉车)

    字符子串和字符子序列的区别 字符字串指的是字符串中连续的n个字符:如palindrome中,pa,alind,drome等都属于它的字串 而字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符: ...

  6. MFC用串行化实现文档存储和读取功能

    在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...

  7. leetcode 验证回文串

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...

  8. leetcode 分割回文串

    这个方法有问题,这是计算所有子串组成的所有回文子串:而不是所有分割的回文子串: class Solution { public: vector<vector<string>> ...

  9. 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等

    本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...

随机推荐

  1. Hadoop(二)自定义输出

    Hadoop提供了较为丰富的数据输入输出格式,可以满足很多的设计实现,但是在某些时候需要自定义输入输出格式. 数据的输入格式用于描述MapReduce作业的数据输入规范,MapReduce框架依靠 数 ...

  2. 错过的sql语句

    总结: 内链接:适合和自己的条件对比,但并没有给出具体条件,要从数据库表里面找,注意有些条件两个表都需要写(嵌套查询貌似也可以 左连接:适合一个表要全部列出来的情况(使用count的时候,注意coun ...

  3. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly

    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java   问题描述:T ...

  4. codeforces 985E Pencils and Boxes(dp+思维)

    E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. 谷歌浏览器无法播放QQ空间视频动画的解决方案

    https://qzonestyle.gtimg.cn/qzone/photo/v7/js/module/flashDetector/flash_tutorial.pdf Chrome开启⽅法 1. ...

  6. spring boot 集成 rabbitmq

    1.使用默认的AmqpTemplate生产消费pojo时,pojo需要implement Serializable,否则会抛出org.springframework.amqp.AmqpExceptio ...

  7. Halcon学习之二:摄像头获取图像和相关参数

    1.close_all_framegrabbers ( : : : ) 关闭所有图像采集设备. 2.close_framegrabber ( : : AcqHandle : ) 关闭Handle为Ac ...

  8. Burpsuite模块—-Intruder模块详解

    一.简介 Burp Intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,Burp Intruder 是高度可配置的,并被用来在广范围内进行自动化攻击.你可以使用 Burp Intr ...

  9. IdentityHashMap

    区别与其他的键不能重复的容器,IdentityHashMap允许key值重复,但是——key必须是两个不同的对象,即对于k1和k2,当k1==k2时,IdentityHashMap认为两个key相等, ...

  10. fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory

    VS2010编译 DirectShow一些项目时遇到 错误:fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory 解决方法: ...