@xialu
2017-05-03T00:23:53.000000Z
字数 1250
阅读 1181
未分类
java:public class Solution {public int calculateMinimumHP(int[][] dungeon) {}}
2.对于任意一个字符串,你可以在它之前添加字符,使得它构成回文序列。现在输入一个字符串,请输出以这种方式,能够得到的最短回文序列。
例如:
输入:"aacecaaa" 输出:"aaacecaaa"
输入:"abcd" 输出:"dcbabcd"
java:public class Solution {public String shortestPalindrome(String s) {}}
假设输入的二维数组为dungeon[m][n],注意两点:
1. 使用额外的O(m*n)空间存储中间结果。这样复杂度降低为O(m*n)。否则复杂度为O(2^(m+n))。
2. 利用一个特点,即对于方格(i,j),勇者该格子中扣除的血量,无法通过之后得到的血瓶进行补偿。
解:
设置二维数组x[m][n],其中x[i][j]记录为了到达终点,勇者在格子(i,j)上的最小血量。
从终点出发,反向遍历矩阵的所有格子,直到回到起点。
在终点处:
if(dungeon[m-1,n-1]>=0)x[m-1,n-1] = 1elsex[m-1,n-1] = 1 - dungeon[m-1,n-1]
状态转移方程为:
temp = min(x[i+1,j],x[i,j+1])if (dungeon[i,j]>=temp)x[i,j]=1elsex[i,j] = temp-dungeon[i,j]
一般对一个长度为n的字符串,取hash的复杂度为O(n)。要做到O(1)内hash,可以利用一个特点,即分界点每移动一次,点两侧的字符串仅变化一个字符。
相应的方法是:多项式插值取模哈希,参考:http://www.cnblogs.com/ka200812/archive/2012/08/30/2663997.html
该方法本质上利用了这样一个规律
1. x*37%H = x%H*37%H
2. (x*37+y)%H = (x%H*37+y)%H