把数字翻译成字符串
题目描述
思路
动态规划+自下而上
状态转换方程:根据逼近结果的可能性来切入
db[n]=db[n-1]+db[n-2] 如果在[10,25]
db[n]=db[n-1] 如果在[0,10)或(25,max]
边界点:
db[0]=db[1]=1
返回结果:
db[n]
代码实现
class Solution {
public int translateNum(int num) {
String num_=num+"";
int db1=1,db2=1;
//注意subString()不包括结束索引
for(int i=2;i<=num_.length();i++){
String tmp=num_.substring(i-2,i);
if(tmp.compareTo("10")>=0&&tmp.compareTo("25")<=0){
int tmp_=db1;
db1+=db2;
db2=tmp_;
}else{
db2=db1;
}
}
return db1;
}
}
复杂度分析
时间复杂度
O(N)
空间复杂度
O(N)
反思不足
思路
根据逼近结果可能性切入,差不多想到了状态转换方程,但没有特别清晰
分类时也没考虑到0x的情况
java se
String
compareTo(String)方法可以按字典序比较两个字符串的大小,等0小负大正
substring(int,int)截取字符串,不包含右
最长不含重复字符的子字符串
题目描述
思路
动态规划+哈希表
要不断更新最近连续字符串的长度,并且与最大长度进行比较更新
如果更新最近连续字符串的长度,分情况,如果当前字符非重复,直接+1,如果重复,则要得到上个重复字符后面的字符长度并+1,这个可以通过减索引实现。
通过索引间的差值也可以起到判定是不是在最近连续子字符串内。
状态转换方程就在文字中
动态规划+线性遍历
不用哈希表存储上次元素的位置,而是从头到尾挨个找
双指针+哈希表
两个指针,一个用于维护不重复指针的左边界,一个用于向前开拓不重复子字符串的长度,并根据二者的差值实时更新最大值
双指针在维护边界这件事上可谓是如鱼得水
代码实现
动态规划+哈希表
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null){
return 0;
}
int max=0;
int lastLen=0,len=0;
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(!map.containsKey(c)){
map.put(c,i);
len=lastLen+1;
}else{
int t=i-map.get(c);
if(t>lastLen) len=lastLen+1;
else {
len=t;
}
map.replace(c,i);
}
if(max<len) {
max=len;
}
lastLen=len;
}
return max;
}
}
双指针+哈希表
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> dic = new HashMap<>();
int i = -1, res = 0;
for(int j = 0; j < s.length(); j++) {
if(dic.containsKey(s.charAt(j)))
i = Math.max(i, dic.get(s.charAt(j))); // 更新左指针 i
dic.put(s.charAt(j), j); // 哈希表记录
res = Math.max(res, j - i); // 更新结果
}
return res;
}
}
复杂度分析
时间复杂度
动态规划+哈希表为O(N),线性遍历则是O(N^2)
空间复杂度
动态规划+哈希表/线性遍历为O(1),不是O(N),因为字符的个数是有限的,是用字符做key
反思不足
思路
在确定迭代方程上仍是差一点,可能是见得不够多,也可能真的是不知道该怎么分析,以逼近结尾的可能性分类讨论,确实是很好的切入手段
java se
String
toCharArray()如果是null会空指针异常
replace()方法用于替换键对应的值
原文地址:http://www.cnblogs.com/zhouj-learn/p/16795012.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性