1.字符串问题
我的做法:dp[i]表示以s[i]结尾的最长无重复字串,更新方程
if (i-dp[i-1], i-1)没有和dp[i]重复的元素,
dp[i]=dp[i-1]+1
else dp[i] = i-samepos, samepos是从i向左数第一个和s[i]重复的元素
时间复杂度O(n^2),空间复杂度O(n)
更好的做法:滑动窗口
左右指针,左指针一次增加一个,右指针直接移动到最长不重复串,由于左指针移动是减少串长度,所以右指针总是递增的。时间复杂度O(N),空间复杂度O(1),只需要维护一个最多26个字母的unordered_set。
2.链表问题
简单问题,分为递归做法和迭代。实际问题
我的做法:用unordered_map存储映射,value存储成time_val形式的,在put和get操作时都更新timestamp。
存在的问题是:在put操作时检查最小时间戳需要O(n)时间,不符合要求。
实际做法:双向链表+哈希表
使用双向链表的原因:便于更新时间戳,为什么不用单向链表?因为删除尾部后无法找到上一个节点。
需要自己手动实现双向链表。