不同路径(数学动态规划)逆序输出(排序)分割回文串(字符串动态规划)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不同路径(数学动态规划)逆序输出(排序)分割回文串(字符串动态规划)相关的知识,希望对你有一定的参考价值。

不同路径(数学、动态规划)

一个机器人位于一个 m x n_ _网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

解答:

class Solution 
    public int uniquePaths(int m, int n) 
        int[][] route = new int[m][n];
        for (int i = 0; i < m; i++) 
            for (int j = 0; j < n; j++) 
                if (i == 0 || j == 0) 
                    route[i][j] = 1;
                 else 
                    route[i][j] = route[i - 1][j] + route[i][j - 1];
                
            
        
        return route[m - 1][n - 1];
    

逆序输出(排序)

如:abcd1234,逆序输出:4321dcba

解答:

import java.lang.*;
import java.io.*;
import java.util.*;
class ReverseString 
    public static void main(String[] args) 
        String input = "abcd1234";
        char[] try1 = input.toCharArray();
        for (int i = try1.length - 1; i >= 0; i--)
            System.out.print(try1[i]);
    

分割回文串(字符串、动态规划)

给你一个字符串 s,请你将_ s _分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。

示例 1: 输入:s = "aab" 输出:[["a","a","b"],["aa","b"]] 示例 2: 输入:s = "a" 输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

解答:

class Solution 
    public List<List<String>> partition(String s) 
        boolean[][] dp = new boolean[s.length()][s.length()];
        for (int len = 1; len <= s.length(); len++) 
            for (int i = 0; i <= s.length() - len; i++) 
                if (len == 1)
                    dp[i][i] = true;
                else if (s.charAt(i) == s.charAt(i + len - 1) && (len == 2 || dp[i + 1][i + len - 2])) 
                    dp[i][i + len - 1] = true;
                
            
        
        return solution(s, 0, dp);
    
    public List<List<String>> solution(String s, int start, boolean[][] dp) 
        ArrayList<List<String>> list = new ArrayList<>();
        if (start == s.length()) 
            List<String> li = new ArrayList<>();
            list.add(li);
            return list;
        
        for (int i = start; i < s.length(); i++) 
            if (dp[start][i]) 
                String first = s.substring(start, i + 1);
                for (List<String> li : solution(s, i + 1, dp)) 
                    li.add(0, first);
                    list.add(li);
                
            
        
        return list;
    

以上是关于不同路径(数学动态规划)逆序输出(排序)分割回文串(字符串动态规划)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode No.132 分割回文串 II(动态规划)

动态规划(Dynamic Programming)

力扣——分割回文串

算法---动态规划(背包问题分割回文串)

Leetcode No.131 分割回文串(DFS)

Leetcode No.131 分割回文串(DFS)