[路飞]_Leetcode 1147. 段式回文

80 阅读3分钟

「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

今天我们来做一下leetcode上面的一道"困难题"

题目链接在这里 1147. 段式回文

题意

image.png

题目大意是,给我们了一个字符串,这个字符串可以变成一个段式回文形式。 至于段式回文,其实就和回文串差不多,只不过现在把回文串中的字符换成了单词,单词的长度最小为1。 然后,让我们求分割成最多个单词的个数。 单个单词也可以形成段式回文,比如 merchant --> (merchant)

思路

首先,这个题目的标签打的是困难,但是明白完思路之后就是一道简单题 🤣

  • 什么是段式回文?

    • 普通的回文串是字符前后对应相同,现在是单词前后对应相同
  • 如何求最大值?

    • 保证回文的单词是最小的即可,而且回文的单词数最小是1个。
    • 从前到后遍历字符串,单词的数目从1开始判断,这样当前数目的单词满足回文时,就会是回文串的最大数目了
    • 得到一个字符串前后回文的最小数目后,递归的对剩下的中间字符同样求 前后回文的最小单词
  • 代码如何实现?

    • 因为需要用到递归,所以可以定义一个主函数,计算字符串中两个位置之间的字符串的 回文串的最大值
    • 记录两个位置之间的字符个数n,如果字符数小于1的话,直接返回字符数
    • 否则,就迭代可能产生段式回文的单词的长度i,从1开始,最大是n/2|0,因为一个单词被拆成前后两个部分最大是前后各一半嘛
    • 在每次迭代i中,判断l和r位置之间的 前i个字符和后i个字符是否相同,需要逐个字符前后比较。即从1到i,比较 前面第k个字符l+k-1和后面第k个字符r-i+1+k-1是否相同。
      • 前i个和后i个字符相同的话,就可以进行递归了,即在l和r位置之间 除去前后i个字符后剩余的中间字符中继续计算。
      • 如果单词数从1到n/2|0时,都不存在回文时,那么当前单词就是个独立的单词了,直接返回 1即可。比如matt 不会形成回文

    这样,我们就分析完了代码实现的思路和边界情况

代码实现

image.png

结束语

做过这道题之后,可以发现,leetcode上面有一部分的困难题其实是名副其实,只要心里上没有抵制,仔细读懂题目,剩下的就是编码过程的细节处理了。

如果有更好的分析思路,欢迎大家在评论区发表看法!⛄