2021-11-17刷题

今天的题目上难度了,是困难难度的动态规划

标签:动态规划、位运算

剑指 Offer 19. 正则表达式匹配

这个题给题意转换一下就是字符串匹配,而字符串匹配我们能想到滑动窗口、KMP算法;KMP算法其实也算是动态规划;这个题其实也是需要用动态规划的思想去解决的

说明boolean[][] dp = new boolean[s.len+1][p.len+1] dp[i][j]=true表示s[i-1]与p[j-1]匹配

题干给出p字符串比s字符串多'.' '*'这两种字符。'.'很好处理,因为它只表示一个能任意匹配的字符;'*'的情况就复杂的多了,它需要与前一个字符搭配使用能表示0个或多个字符,因此我们根据p[j]是否为*来

分情况讨论:

当p[j] == '*'时:

1. s从0到i与p从0到j-2匹配,即p[j-1]p[j]代表0:dp[i][j-2]==true && p[j]=='*'

2. s从0到i-1与p从0到j匹配且s[i] == p[j-1]:dp[i-1][j]==true && (s[i-1] == p[j-2] || p[j-2] == '.')

当p[j] != '*'时

1. s从0到i-2与p从0到j-2匹配且 s[i-1]==p[i-1]匹配:dp[i-1][j-1] == true && (s[i-1]==p[j-1] || p[j-1]=='.')

初始化

动态规划dp表的初始化dp[0][0]=true,对s[0]时需要对p[2k]=='*'? (k=1,2,3...)做初始化

318. 最大单词长度乘积

直观解法就是暴力搜索,使用hashSet存储每个word的字符,再逐字符查询isContain()。word与word之间的比较一定是n^2的时间复杂度,所以优化的关键点就在将word转换成26位长的表示改位的字符是否存在的数字(题干给出只存在小写字母)。思路如果没见过的话,比较难想到

判断 两个对象是否相等 -> hash -> 很多情况下hash可以用数组代替 -> 位运算,与或非

你可能感兴趣的:(2021-11-17刷题)