Problem 46:把数字翻译成字符串
public int numDecodings(String s){
if(s == null || s.length() == 0 || s.charAt(0) == '0') return '0';
int[] dp = new int[s.length()+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= s.length(); i++){
int one = Integer.valueOf(s.subString(i-1, i));
if(one != 0) dp[i] += dp[i-1];
if(s.charAt(i-2) == '0') continue;
int two = Integer.valueOf(s.substring(i-2, i));
if(two <= 26) dp[i] += dp[i-2];
}
return dp[s.length()];
}
Problem 47:礼物的最大价值
public int getMost(int[][] values){
if(values == null || values.length == 0 || values[0].length == 0) return 0;
int n = value[0].length;
int[] dp = new int[n];
for(int[] value : values){
dp[0] += value[o];
for(int i = 1; i < n; i++)
dp[i] = Math.max(dp[i], dp[i-1]) + value[i];
}
return dp[n-1];
}
Problem 48:最长不含重复字符的子字符串
public int longestSubStringWithOutDuplcation(String str){
int curLen = 0. nexLen = 0;
int[] preIndexs = new int[26];
Array.fills(preIndexs, -1);
for(int curI = 0; curI < str.length(); curI++){
int c = str.charAt(curI) - 'a';
int preI = preIndexs[c];
if(preI == -1 || curI -preI > curLen) curLen++;
else{
maxLen = Math.max(maxLen, curLen);
curLen = curI - preI;
}
preIndexs[c] = curI;
}
MaxLen = Math.max(maxLen, curLen);
return maxLen;
}
Problem 49:丑数
public int uglyNumber(int n){
if(n <= 6) return n;
int[] dp = new int[n];
int i2 = 0, i3 = 0; i5 = 0;
dp[0] = 1;
for(int i = 1; i < n; i++){
int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;
dp[i] = Math.min(Math.min(next2, next3), next5);
if(dp[i2] == next2) i2++;
if(dp[i3] == next3) i3++;
if(dp[i5] == next5) i5++;
}
return dp[n-1];
}
Problem 50:第一个只出现一次的字符
public int FirstNotRepeat(String str){
Map<Character, Integer> map = new LinkedHashMap();
for(int i = 0; i < str.length(); i++){
if(map.containsKey(str.charAt(i)))
map.put(str.charAt(i), map.get(str.charAt(i))+1);
else
map.put(str.charAt(i), 1);
}
for(int i = 0; i < str.length(); i++){
if(map.get(str.charAt(i)) == 1)
return map.indexOf(str.charAt(i));
}
return -1;
}