一、问题
把字符串 s 看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s 看起来是这样的:
"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd...." .
现在给定另一个字符串 p 。返回 s 中 唯一 的 p 的 非空子串 的数量 。
输入: p = "cac" 输出: 2 解释: 字符串 s 中的字符串“cac”只有两个子串“a”、“c”。.
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-substrings-in-wraparound-string
二、代码
var findSubstringInWraproundString = function(p) {
var ans = 0;
var maps = [];
var memo = [];
if(p.length <= 0) { return 0; }
for(let i = 0; i < 25; i++) {
maps[i] = i+1;
memo[i] = 0;
}
maps[25] = 0;
memo[25] = 0;
let p_c = 1;
p = p + '#';
let start = p.charCodeAt(0) - 97;
for(let i = 0; i < p.length; i++) {
let code = p.charCodeAt(i) - 97;
//if(p_c == 1 && p[i] != '#') { start = code; }
if(p[i] == '#') {
let t_p_c = p_c;
let pos = start + p_c - t_p_c;
while(t_p_c > 0) {
memo[pos] = Math.max(memo[pos], t_p_c);
pos = maps[pos];
t_p_c--;
}
p_c = 1;
break;
}
if(i > 0) {
let prev_code = p.charCodeAt(i-1) - 97;
if(maps[prev_code] == code) {
p_c++;
} else {
let t_p_c = p_c;
let pos = start + p_c - t_p_c;
while(t_p_c > 0) {
memo[pos] = Math.max(memo[pos], t_p_c);
pos = maps[pos];
t_p_c--;
}
start = code;
p_c = 1;
}
}
}
for(let i = 0; i < memo.length; i++) {
ans += memo[i];
}
return ans;
};