coding: 段式回文

238 阅读2分钟

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

image_1564892108.png 我们已知: 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)