「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情」
今天我们来做一下leetcode上面的一道"困难题"
题目链接在这里 1147. 段式回文
题意
题目大意是,给我们了一个字符串,这个字符串可以变成一个段式回文形式。 至于段式回文,其实就和回文串差不多,只不过现在把回文串中的字符换成了单词,单词的长度最小为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 不会形成回文
这样,我们就分析完了代码实现的思路和边界情况
代码实现
结束语
做过这道题之后,可以发现,leetcode上面有一部分的困难题其实是名副其实,只要心里上没有抵制,仔细读懂题目,剩下的就是编码过程的细节处理了。
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄