> 文章列表 > LeetCode 1147. 段式回文

LeetCode 1147. 段式回文

LeetCode 1147. 段式回文

LeetCode 1147. 段式回文

难度:hard\\color{red}{hard}hard


题目描述

你会得到一个字符串 texttexttext 。你应该把它分成 kkk 个子字符串 (subtext1,subtext2,…,subtextk)(subtext1, subtext2,…, subtextk)(subtext1,subtext2subtextk) ,要求满足:

  • subtextisubtextisubtexti非空 字符串
  • 所有子字符串的连接等于 texttexttext ( 即subtext1+subtext2+...+subtextk==textsubtext1 + subtext2 + ... + subtextk == textsubtext1+subtext2+...+subtextk==text )
  • 对于所有 i 的有效值( 即 1<=i<=k1 <= i <= k1<=i<=k ) ,subtexti==subtextk−i+1subtexti == subtextk - i + 1subtexti==subtextki+1 均成立

返回kkk可能最大值。

示例 1:

输入:text = "ghiabcdefhelloadamhelloabcdefghi"
输出:7
解释:我们可以把字符串拆分成 "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)"。

示例 2:

输入:text = "merchant"
输出:1
解释:我们可以把字符串拆分成 "(merchant)"。

示例 3:

输入:text = "antaprezatepzapreanta"
输出:11
解释:我们可以把字符串拆分成 "(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)"。

提示:

  • 1<=text.length<=10001 <= text.length <= 10001<=text.length<=1000
  • texttexttext 仅由小写英文字符组成

算法

(递归)

对一个字符串 text 来说,从前往后记为 left ,从后往前记为 right 如果可以划分就代表 text[left] == text[right]

只要找到相同的前后缀,就同时改变字符串 text

复杂度分析

  • 时间复杂度O(n2)O(n^2)O(n2)

C++ 代码

class Solution {
public:int longestDecomposition(string text) {if (text.empty()) return 0;for (int i = 1, n = text.length(); i <= n / 2; ++ i){if (text.substr(0, i) == text.substr(n - i)){return 2 + longestDecomposition(text.substr(i, n - i * 2));}}return 1;}
};