项目介绍
- 本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;
- 建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。
Part One : 牛刀小试
这部分内容选取了几道比较简单的动态规划题目,来逐步了解什么是动态规划。
- 1、青蛙跳台阶
- 2、最大子段和
- 3、最长公共子序列
- 4、回文应用(Palindrome)
- 4.1、判断字符串是否属于回文
- 4.2、添加一个字符构造回文
- 4.3、删除一些字符构造回文
- 4.4、查找字符串中最长的连续回文子串
Part Two : 抛砖引玉
这部分内容只给出了基础的解,如果有更优化的解法,请在下方留言。
Part Three : 综合集锦
这部分内容的解法不限于动态规划,包括贪心、回溯等。
正文开始
1、青蛙跳台阶
- 题目描述:在爬楼梯时,每次可向上走1阶台阶或2阶台阶,问有n阶楼 梯有多少种上楼的方式
- 代码实现:ClimbStairs,测试用例:ClimbStairsTest
- 设计思路:
- 状态转换方程:
statusNum[i] = statusNum[i-1] + statusNum[i-2];
- 注意事项:
- 对于经常访问的数据,可以设置缓存,方便读取。
2、最大子段和
状态转换方程:
LargestSum[i] = Math.max(LargestSum[i-1] + Sequence[i], Sequence[i]);
- 动态规划优化法: