1、台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution {
public int JumpFloor(int target) {
if(target <= 0){
return 0;
}
int pre = 1;
int last = 2;
if(target == 1 || target == 2){
return target;
}
else{
for(int i=3;i<=target;i++){
int temp = pre + last;
pre = last;
last = temp;
}
}
return last;
}
}
2、请设计一个尽量优的解法求出序列的最长上升子序列的长度。
给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。
注意:必须返回的是上升的子序列,而且是最长的,显然这是一个动态规划问题,详情看代码。
测试样例:
[1,4,2,5,3],5
返回:3
import java.util.*;
public class LongestIncreasingSubsequence {
public int getLIS(int[] A, int n) {
// write code here
int[] res = new int[A.length];
res[0] = 1;
int RM = 0;
for(int i =1;i<n;i++){
int Max = 0;
for(int j=0;j<i;j++){
if(A[j]<A[i] && Max<res[j]){
Max = res[j];
}
}
res[i] = Max + 1;
if(RM<res[i]){
RM = res[i];
}
}
return RM;
}
}
3、LCS问题:即最长公共子序列问题.
给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”123456"或者"12C4B6"都是最长公共子序列。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例:
“1A2C3D4B56”,10,“B1D23CA45B6A”,12
返回:6
import java.util.*;
public class LCS {
public int findLCS(String A, int n, String B, int m) {
if(n==0||m==0){
return 0;
}
char[] a = A.toCharArray();
char[] b = B.toCharArray();
int[][] result = new int[n+1][m+1];
//因为最长公共子串可能为0,所以第一行第一列为0,不用第一步再额外判断字符串是否为空
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
/*
result[i][j]的取值分了三种情况:
一:来自result[i-1][j]
二:来自result[i][j-1]
三:来自result[i-1][j-1] +1,这里是由于str1[i]==str2[j].
所以这里只要取他们三者最大值即可!
*/
result[i+1][j+1] = Math.max(result[i][j+1],result[i+1][j] );
if(a[i]==b[j]){
result[i+1][j+1] = Math.max(result[i+1][j+1],result[i][j]+1);
}
}
}
return result[n][m];
}
}