每日写题分享--段式回文--递归

题目描述:

段式回文 其实与 一般回文 类似,只不过是最小的单位是 一段字符 而不是 单个字母。

举个例子,对于一般回文 "abcba" 是回文,而 "volvo" 不是,但如果我们把 "volvo" 分为 "vo"、"l"、"vo" 三段,则可以认为 “(vo)(l)(vo)” 是段式回文(分为 3 段)。

给你一个字符串 text,在确保它满足段式回文的前提下,请你返回 段 的 最大数量 k。
题目链接戳此

解题思路:

题目已经明确说明给定的字符串是段式回文,不需要判断,那么我们只需要找并且数数就OK了。本题可以用动态规划或者贪心算法,这里我们用的是递归。先从字符串的头和尾找到相同的字符串,并把剩下的截取出来应用自身函数递归。

由于返回的是数量,字符串最中间的字符串并没有与它相等的,所以在递归计算完成之后还需要加1,这里不好实现,就另外写了个函数传了个参数n。

代码实现如下:

class Solution {
    public int longestDecompositionHelp(String text,int n) {
        if (text.equals("")) return n;
        int len = text.length();
        for (int i = 0;i < len/2;i++) {
            if (text.substring(0,i + 1).equals(text.substring(len - i - 1,len))) {
                return longestDecompositionHelp(text.substring(i + 1,len - i - 1),n + 2);
            }            
        }
        return n + 1;
    } 
    public int longestDecomposition(String text) {
        return longestDecompositionHelp(text,0);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值