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

时间:2022-07-22 00:51:58

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

一个机器人位于一个 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;
    }
}

本文内容到此结束了, 如有收获欢迎点赞????收藏????关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问????欢迎各位大佬指出。 主页共饮一杯无的博客汇总????‍????

保持热爱,奔赴下一场山海。????????????