defcountSubstrings(self, s: str, t: str) -> int: result = 0 for index_s, alpha_s inenumerate(s): for index_t, alpha_t inenumerate(t): # 寻找每一个不相同的数左右扩展比较 if alpha_s == alpha_t: pass else: l = 1 r = 1 while index_s-l >= 0and index_t-l >= 0and s[index_s - l] == t[index_t - l]: l += 1 while index_s + r < len(s) and index_t + r < len(t) and s[index_s + r] == t[index_t + r]: r += 1 result += l*r return result
defnumWays(self, words: List[str], target: str) -> int: alphas = [0for k inrange(26)] MOD = 10**9+7 word_num = len(words[0]) target_num = len(target) dp = [[0]*target_num for i inrange(word_num)] num = 0 for word in words: if word[0] == target[0]: num += 1 dp[0][0] = num # dp[0][j>0] = 0无法构成
for i inrange(1, word_num): for a inrange(26): alphas[a] = 0 # alpha 数组为后面的循环做准备,降低时间复杂度 ss = 0 for word in words: alphas[ord(word[i])-ord('a')] += 1 ss += word[:i+1].count(target[0]) dp[i][0] = ss # 使用前i个字符拼成 target 第 0 个字符的个数 # 超过 word_num 的部分无法匹配出 for j inrange(1, min(target_num, word_num)): # words中第 i位中有多少个可以作为 target 第j位的选择 num = alphas[ord(target[j])-ord('a')] dp[i][j] = (dp[i-1][j] + dp[i-1][j-1] * num) % MOD return dp[word_num-1][target_num-1]
deffindRepeatNumber(self, nums: List[int]) -> int: repeat_dict = {} for i in nums: if i in repeat_dict: return i else: repeat_dict[i] = 1 return -1
原地哈希方法,时间复杂度 O(n),空间复杂度 O(1),很巧妙。具体做法就是因为题目中给的元素是小于 n-1 的,所以我们可以让位置i的地方放元素i。如果位置 i 的元素不是 i 的话,那么我们就把 i 元素的位置放到它应该在的位置,即 nums[i] 和 nums[nums[i]] 的元素交换,这样就把原来在nums[i]的元素正确归位了。如果发现要正确归位的时候,位置上已经有和自己一样的元素了,说明就重复了。相当于将原列表中每个元素 hash() 到列表索引的位置,由于使用原列表,空间复杂度就很小。
1 2 3 4 5 6 7 8 9 10 11 12
deffindRepeatNumber(self, nums: List[int]) -> int: for i, v inenumerate(nums): while i != v: # 交换 v_pos = nums[v] if nums[v_pos] == v: return v else: # 将 v 放到属于自己的位置 nums[i] = nums[v_pos] nums[v_pos] = v return -1
剑指 Offer 16. 数值的整数次方
比较重要的一个地方 int 的范围是 -2147483648 到 2147483647,如果对 -2147483648 取绝对值会导致 int 型溢出,而2147483647(01111…1) 溢出后还是 -2147483648(100…0) 需要扩大数据类型。(python表示从不关心这个)
本题涉及到快速幂 快速幂一般处理那种指数爆炸的题目,往往要取余 (a * b) % p = (a % p * b % p) % p
longlongfastPower(longlong base, longlong power){ longlong result = 1; while (power > 0) { if (power & 1) {//此处等价于if(power%2==1) result = result * base % 1000; } power >>= 1;//此处等价于power=power/2 base = (base * base) % 1000; } return result;
for i inrange(len(a)): rows = [] for j inrange(len(a[i])): temp = 0 for k inrange(len(a[i])): temp = (temp + a[i][k] * b[k][j]) rows.append(temp) res.append(rows)
return res
defmatrix_quick_pow(a, n: int): # 单位矩阵 res = [[1if i == j else0for j inrange(len(a))] for i inrange(len(a))]