取余操作的性质(a + b) % c = (a % c + b % c) % c.
((a+b) % p + c) % p = (a + (b+c) % p) % p
时间复杂度为log(n)的做法位运算,n & (n - 1)是把n的最后一位1变为0,因此可以快速迭代。
3.对于快速幂算法,可以使用移位操作的思想简化。
大数问题,字符串打印,可以考虑dfs来做。
经典的动态规划,主串s和模式串p,dp[i][j]表示s的前i个元素和p的前j个元素匹配是否成功,对于p,若第j个元素是字母或小数点,与s的第i个元素匹配成功则dp[i][j] = dp[i - 1][j - 1],否则为false。
若第j个元素p[j - 1]为'*',则看前一个元素,若p[j - 2]和主串s[i - 1]可以匹配,则可以忽略掉s[i - 1]继续匹配,即dp[i][j] = dp[i - 1][j]!!!!!
若不可以匹配则dp[i][j] = dp[i][j - 2],把该元素丢掉。
值得注意的是对于dp数组的边界选取,初始时dp[0][0] = true,之后初始化i = 0,j = 1默认了左边界为false。
很简单,不过值得注意的是在链表题中可以手动建立一个空头结点简化运算。
在做递归题目时,需要对递归定义明确,这道题不难,不过树的子结构和相同根节点的子结构是两个问题,需要明确才能递归。