Github IO

每日一题——不定时日更

Match 14th: Design Hashmap

遇到的问题:遇到了莫名其妙的错误,懵比了半天
解决方法:线性探测在删除之后offset仍不变,如果偷懒不记录offset,删除前面的key,key值变为-1,查询同样hash value的key会导致不能依据遇到-1就停止。违反逻辑以提升性能,纯属自作聪明了。
经验:如果找不出错误,就重新选择、排列操作,从而定位问题点。

March 12th: Verify Preorder Serialization of a Binary Tree

主要要建立插槽的概念,每加入一个数都增加两个slot,消耗一个slot,遇到非数则消耗一个slot。进一步可以简化为一个slot计数器。
感想: 要把想法概念化,这样更容易理解和做题。

March 7th: Palindrome Partitioning

dfs

其实dfs就是第一层循环内递归
在这题中,用dfs判断以i起点的子串是否能划分成【所有划分都是回文串】,就是
1.【回文串划分】以i为起点的子串一次,找到边界j0, j1, j2, ...
2. 再次对每个j调用dfs判断余下的子串[j+1, ...]。

void isValidPart(str, i)
{
  // termination
  if(i == n)
  {  
    ans.push_back(ans_part);
    return;
  }
  // recursion
  for(int j = i; j < n; ++j)
  {
    if(isPalindrome(str, i, j))
    {
      ans_part.push_back(str.substr(i, j - i + 1));
      isValidPart(str, j + 1);
      ans_part.pop_back();
    }
  }

dp

dp关键思想就是递推式(由已知得未知)
在这题中,dp用来判断一个子串是否是回文串

dp[i][j] = (str[i] == str[j] && dp[i+1][j-1])

记忆化搜索

记忆化搜索是懒惰搜素,并记录搜索过程中产生的所有有用结果,迎合了dp的需求

在这题中,不适用遍历所有(i, j)来计算所有dp,仅当(i, j)需要被获取时才递归地计算并记录。

  • 令dp[i][j]有三态:enum{TRUE, FALSE, NO_RECORED}
  • 每次调用都记录结果:return dp[i][j] =
int isPalindrome(str, i, j)
{
  if(dp[i][j])
    return dp[i][j];
  if(i >= j)
    return dp[i][j] = true;
  return dp[i][j] = (str[i] == str[j]) ? isPalindrome(str, i+1, j-1) : false;
}
posted @ 2021-03-07 10:01  laiyk  阅读(51)  评论(0)    收藏  举报