首页 > 其他分享 >【NO.99】LeetCode HOT 100—647. 回文子串

【NO.99】LeetCode HOT 100—647. 回文子串

时间:2023-10-31 11:02:25浏览次数:34  
标签:子串 字符 下标 int HOT NO.99 647 ans 回文


题目:647. 回文子串

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”

示例 2:

输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

方式一:动态规划

定义:函数dp[i][j]代表从下标i到下标j这一段是否是回文子串,值为true、false

动态转移方程:假如下标i对应的字符与下标j对应的字符相等,那位置的结果就要看下标i+1与下标j-1对应的字符的关系,即dp[i][j] = dp[i+1][j-1]; 还要注意两个下标之间的长度,假如 j - i < 2,说明此时两个字符是相邻的,那此时dp[i][j] = true。

/**
 * 时间复杂度:O(n^2)
 * 空间复杂度:O(n^2)
 */
  public int countSubstrings(String s) {
      boolean[][] dp = new boolean[s.length()][s.length()];
      int result = 0;

      // 下标i在前,j在后  
      for (int j = 0; j < s.length(); j++) {
          for (int i = 0; i <= j; i++) {
              if ((s.charAt(i) == s.charAt(j)) && ((j - i < 2) || dp[i+1][j-1])) {
                  dp[i][j] = true;
                  result++;
              }
          }
      }

      return result;
  }

方法二:中心扩展法

枚举每一个可能的回文中心,然后用两个指针分别向左右两边拓展,当两个指针指向的元素相同的时候就拓展,否则停止拓展。但要考虑一个问题:这个中心是一个字符还是两个字符。所以这两种情况都需要考虑。

/**
 * 时间复杂度:O(n^2)
 * 空间复杂度:O(1)
 */
class Solution {
  public int countSubstrings(String s) {
    int n = s.length();
    int ans = 0;
    // 逐个字符进行中心扩展,ans代表总回文子串的数目
    for (int center = 0; center < n; center++) {
      // 这里有两种情况:
      // 1是单个字符为中心,往两边扩展
      // 2是以两个字符为中心,往两边扩展
      ans += expand(s, center, center) + expand(s, center, center + 1);
    }
    return ans;
  }

  private int expand(String s, int left, int right) {
    int ans = 0;
    while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
      ans++;
      left--;
      right++;
    }
    return ans;
  }
}


标签:子串,字符,下标,int,HOT,NO.99,647,ans,回文
From: https://blog.51cto.com/u_15714244/8102526

相关文章

  • 【NO.100】LeetCode HOT 100—739. 每日温度
    题目:739.每日温度给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,1......
  • 快照snapshot
    快照snapshot快照功能通常是以写入时复制技术来实作。Linux通过逻辑卷轴管理员实作快照功能。写入时复制写入时复制(英语:Copy-on-write,简称COW)是一种计算机[程序设计]领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获......
  • Photoshop 2020 中文免费版下载含安装包
    AdobePhotoshopCC中文版除去PhotoshopCS6中所包涵的功能,PhotoshopCC还新增相机防抖动、CameraRAW功能改进、图像提升采样、属性面板改进、Behance集成等等功能。adobephotoshopcc2020拥有智能型锐利化、智能型增加取样、3D场景面板、建立晕映效果、修图、水印、羽化等等功......
  • Java Hotspot G1 GC 原理
    目录原理概念初始堆占用情况标记RememberSet原理CardTableCollectSet停顿预测模型G1的垃圾回收过程对象分配线程本地分配缓冲区Eden区中分配Humongous区分配堆内存结构传统的GC收集器G1收集器G1垃圾收集周期YoungGCYoungGC总结MixedGC全局并发标记初始标记根区域扫描......
  • Adobe_Photoshop_2024_25.0.0.37图文安装教程及下载
    Adobe_Photoshop_2024正式版,拥有之前beta版本的全部功能,包括但不限于内置AI绘图,一键抠图、移除工具、悬浮工具栏、图像扩展、填充式生成、调整预设等等。尤其是“生成式填充”和“生成式扩展”。除此之外,PS2024正式版还内置了NeuralFilters神经AI滤镜,这款插件用于图片的处理,它......
  • 新手教程系列:照片传输、整理、分享,Synology Photos一套轻松搞定
    谁说简单易用一定要牺牲安全?SynologyPhotos可让您轻松分享充满回忆的相册,同时确保相册安全,无论是分享一张照片,还是一个视频或者整个相册,群晖都能满足您的需求,它可不仅限去共享照片功能,还有传输,收集,整理,堪比摄影小助理,所以今天就来盘一盘如何让 SynologyPhotos成为你的摄影助理......
  • photon rust 图像处理库
    photon是一个基于rust开发的图像处理库,同时也支持基于WebAssembly的处理参考nodejs使用添加依赖{"name":"image-demo","version":"1.0.0","main":"index.js","license":"MIT",......
  • 【论文阅读笔记】【SAM相关】 Matcher: Segment Anything with One Shot Using All-Pu
    读论文时思考的问题论文试图解决什么问题?如何更好地建立视觉方面的fundationmodel如何建立一个模型,使得其在没有人类输入信号的情况下(这里主要是one-shotimage)能更好地挖掘SAM的能力,实现相同的语义元素(好像不一定要求是一个实例)的分割(并提取割出来的物体的语义信息?)......
  • gerrit 快捷键说明 shotcuts 说明
    gerrit是一个git仓库,可以快速的对比代码的不同。下面记录一下快捷键NavigationwithinthereviewUIcanbecompletelydonebykeys,andmostactionscanbecontrolledbykeyboardshortcuts.Typing?opensapopupthatshowsalistofavailablekeyboardshortcu......
  • chatGPT发展中Few-Shot, Zero-Shot & One-shot 的通俗理解
    先解释one-shot。公司门禁用了人脸识别,你只提供一张照片,门禁就能认识各个角度的你,这就是one-shot。可以把one-shot理解为用1条数据finetune模型。在人脸识别场景里,one-shot很常见。zero-shot与few-shot,回到NLP场景。用wikipedia、新闻等,训练一个GPT模型,直接拿来......