青蛙跳楼梯
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
// 动态规划实现func jump(n int) int {if n <= 2 {return n}dp := make(map[int]int, n)dp[1] = 1dp[2] = 2for i := 3; i <= n; i++ {dp[i] = dp[i-1] + dp[i-2]}return dp[n]}
// 递归实现func jump(n int) int {if n <= 2 {return n}return jump1(n-1) + jump1(n-2)}
机器人
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?
// m是列数,n是行数func robot(m, n int) int {if m <= 0 || n <= 0 {return 0}dp := make([][]int, m)a, b := m, nfor m != 0 {m--dp[m] = make([]int, n)dp[m][0] = 1}for n != 0 {n--dp[0][n] = 1}for i := 1; i < a; i++ {for j := 1; j < b; j++ {dp[i][j] = dp[i-1][j] + dp[i][j-1]}}return dp[a-1][b-1]}
回文字符串
func longestPalindrome(s string) string {max := 1begin := 0length := len(s)dp := make([][]bool, length,length)for i := 0; i < length; i++ {dp[i] = make([]bool,length,length)dp[i][i] = true}for j := 1; j < length; j++ { // 遍历行for i := 0; i < j; i++ { // 遍历列if s[j] != s[i] {dp[i][j] = falsecontinue}if j-i < 3 { // 字符串就 1 或 2个dp[i][j] = true} else {// 保障内部是回文字符串dp[i][j] = dp[i+1][j-1]}if dp[i][j] && j-i+1 > max {max = j - i + 1begin = i}}}return s[begin:begin+max]}
