oPPo笔试第三题
放一下第三题我的解题思路:
题目是将字符串s变为包含至少k个"oppo"子串所需要的最小操作次数(只能字符替换)(oppoppo包含2个oppo)
这题我用动态规划做的,定义一个三维数组dp[n][k+1][2],其中最后一个维为0表示不以o结尾,1表示以0结尾
那么递推公式为
当前位置上为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])+1
dp[i][j][1]=min(dp[i][j][0]-1,dp[i-3][j-1][0]+{把前三位位转为”OPP“的代价},dp[i-1][j][1],dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})
当前位置上不为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])
dp[i][j][1]=min(dp[i][j][0],dp[i-3][j-1][0]+{中间两位转为”PP“的代价}+1,dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})+1
感觉想得有点复杂,有没有大佬有更好的方法,分享一下
题目是将字符串s变为包含至少k个"oppo"子串所需要的最小操作次数(只能字符替换)(oppoppo包含2个oppo)
这题我用动态规划做的,定义一个三维数组dp[n][k+1][2],其中最后一个维为0表示不以o结尾,1表示以0结尾
那么递推公式为
当前位置上为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])+1
dp[i][j][1]=min(dp[i][j][0]-1,dp[i-3][j-1][0]+{把前三位位转为”OPP“的代价},dp[i-1][j][1],dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})
当前位置上不为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])
dp[i][j][1]=min(dp[i][j][0],dp[i-3][j-1][0]+{中间两位转为”PP“的代价}+1,dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})+1
感觉想得有点复杂,有没有大佬有更好的方法,分享一下
全部评论
是这样做的,我也是
相关推荐