coding: 段式回文
题目
段式回文 其实与 一般回文 类似,只不过是最小的单位是 一段字符 而不是 单个字母。
举个例子,对于一般回文 "abcba" 是回文,而 "volvo" 不是,但如果我们把 "volvo" 分为 "vo"、"l"、"vo" 三段,则可以认为 “(vo)(l)(vo)” 是段式回文(分为 3 段)。
给你一个字符串 text,在确保它满足段式回文的前提下,请你返回 段 的 最大数量 k。 如果段的最大数量为 k,那么存在满足以下条件的 a_1, a_2, ..., a_k:
示例 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)"。
示例 4:
输入:text = "aaa"
输出:3
解释:我们可以把字符串拆分成 "(a)(a)(a)"。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-chunked-palindrome-decomposition
题解
算法
贪心+递归
依次取字符串前后最短子字符串为段即可。
推理过程解释如下: 如果字符串存在首尾长的匹配 字符串 B1 和 B2 ,同时 也存在短的匹配R1 和 R4,则:
B1 = B2 R1 = R4
我们已知:
B1 = R1 + S + R2
B2 = R3 + S + R4
因为R1 = R4并且B1 = B2,则可以推理出:
R1 = R3
R2 = R4
R1 = R2 = R3 = R4
如果按照较长的匹配B1 B2来分词,则此时分词数目最多为2,而按照较短的匹配来分词则此时的分词的数目则为6,因此我们应当按照最小的分词来匹配,即可得到最大分词数.
代码
class Solution {
public int longestDecomposition(String text) {
int n = text.length();
for(int i = 1;i <= n/2; ++i){
if(text.substring(0,i).equals(text.substring(n-i,n))){
return 2 + longestDecomposition(text.substring(i,n-i));
}
}
return n == 0 ? 0:1;
}
}
作者:mike-meng
链接:https://leetcode-cn.com/problems/longest-chunked-palindrome-decomposition/solution/di-gui-by-mike-meng-4/
来源:力扣(LeetCode)