字符串循环左移:
(X’Y’)’ = YX
X = ab, Y = cde
cdeab = YX = (X’Y’)’ = (baedc)’ = cdeab
将前后两段分别翻转, 然后连接起来, 最后翻转.
LCS 最长公共子序列
对于 X,Y 两个字符串, 会有
LCS(Xm, Yn) = | LCS(X(m-1), Y(n - 1)) if (Xm == Yn)
| max(LCS(X(m-1), Yn), LCS(Xm, Y(n - 1))) if (Xm ~= Yn)
使用循环数组求两个字符串的最大LCS长度。
当计算 chess[i][j] 的时候, 只可能需要 chess[i-1][j-1], chess[i-1][j], chess[i][j-1]三个值,
所以不需要维护一个m*n的数组, 只需要一个长度为n 的数组循环覆盖即可, 另外, chess[i-1][j-1]会被覆盖, 所以需要另外存起来。
最长递增子序列
LIS(X)
X’ = sort(X);
LIS(X) = LCS(X, X’);
动态规划解法:
Li = L(i-1) + 1, 当 X[i] > X[i + 1]
Li = L(i - 1)
字符串全排列
KMP
text 为目标串
pattern 为模式串
i 为当前目标串索引, j 为当前模式串索引
模式串的最大相等前缀
if(text[i + j] == pattern[j]){
j++;
} else{
}