字符串最少由多少回文子串构成

昨天的腾讯笔试题

第五题,题意大概是这样的

  1. 第一行输入一个字符串 s,1 <= s.length() <= 400
  2. 第二行输入该组有多少个测试 n
  3. 后面n行,每行输入两个数字,l,r用空格分割,l和r分别表示s的子串左右边界,1 <= l <= r <= s.length()
    例子:
输入
ababa
4
1 5
2 5
1 4
2 4

输出
1
2
2
1

解释:1 5表示子串为ababa,此时本就为回文,所以最少由一个回文串构成,2 5表示子串为baba,此时可由bab+a构成,也可由b+aba构成,所以输出为2

题解

由于昨天在这道题上浪费了快50min,且未得分,心有不甘,感觉前半部分思路正确,但是后面计算最少组成的时候就脑袋宕机了,故在LeetCode上找了一个类似的题,进行解答,最后通过,便写下该博客。题为:分割回文串 II,给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串,返回符合要求的最少分割次数。所以此题与笔试题是差不多的,在笔试题的返回答案上减1即为该lc题的答案

程序

思路为

  1. 建立一个boolean[s.length()][s.length()]的dp矩阵
  2. i表示子串开始位置,j表示子串结束位置,利用矩阵上三角进行处理该子串是否为回文串
  3. 建立一个同等大小的int矩阵res,也是利用上三角存放该子串最少可由多少个回文串组成
import java.util.Arrays;

public class CycleString {
   
    public static void main(String[] args) {
   
        String s = "ababaccc";
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        for(int i = len - 1;i >= 0;i--){
   
            dp[i][i] = true;
            for (int j = i+1; j < len ; j++) {
   
                if(s.charAt(i) == s.charAt(j)){
   
                    dp[i][j] = i == j - 1 || dp[i+1][j-1];
                }
            }
        }
        for (boolean[] booleans : dp) {
   
            System.out.println(Arrays.toString(booleans));
        }
        int[][] res = new 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值