467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)
DP
- s是周期性字符串,在s的子串中,只要知道子串的第一个字符或者最后一个字符和子串长度,就可以确定这个子串。例如如果子串以‘d’结尾,长度为3,那么该子串为’bcd’
- 对于同一个字符串结尾的字符,长的那个子串必然包括短的那个。例如’abcd’和’bcd’都以‘d’结尾,’bcd’是‘abcd’的子串
var findSubstringInWraproundString = function{p){
const dp = new Array(26).fill(0);
let k=0;
for(let i=0;i<p.length;i++){
// 字符串之差为1或者-25
if(i>0&&(p[i].charCodeAt()-p[i-1].charCodeAt()+26)%26===1){
++k;
}else{
k = 1;
}
dp[p[i].charCodeAt() - 'a'.charCodeAt()] = Math.max(dp[p[i].charCodeAt() - 'a'.charCodeAt()],k)
}
return _.sum(dp);
}
- 如何表示字母连续。(p.charAt(i) - p.charAt(i - 1) + 26) % 26 == 1
- 数组求合 Arrays.stream(dp).sum();
- 如何去掉可能重复的子串,保留最长的 Math.max(dp[p.charAt(i) - ‘a’], k)
执行结果:通过
执行用时:72 ms, 在所有 JavaScript 提交中击败了64.81%的用户
内存消耗:43.1 MB, 在所有 JavaScript 提交中击败了46.30%的用户
通过测试用例:81 / 81
/**
* @param {string} p
* @return {number}
*/
var findSubstringInWraproundString = function(p) {
let dp = new Array(26).fill(0);
let k = 0;
for(let i=0;i<p.length;i++){
if((i>0&&p[i].charCodeAt()-p[i-1].charCodeAt()+26)%26===1){
++k
}else{
k = 1
}
dp[p[i].charCodeAt()-'a'.charCodeAt()] = Math.max(dp[p[i].charCodeAt()-'a'.charCodeAt()],k)
}
return eval(dp.join('+'))
};
执行结果:通过
执行用时:60 ms, 在所有 JavaScript 提交中击败了100.00%的用户
内存消耗:43.2 MB, 在所有 JavaScript 提交中击败了46.30%的用户
通过测试用例:81 / 81