You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varremoveDuplicates=function(s, k){
for (let left =0; i <s.length- k +1; left++){let right = i;
while(s[right+1]== s[left]){
right = right +1;
}
const gap = right - left +1;if(gap >= k){
s = s.substr(0, i)+ s.substr(i + gap, s.length)
left =-1}}return s
};
和删除相邻重复项是同一个类型,利用栈来存储扫描过的字符,不一样的是该题支持 k 个,这个理论上可以按照上一题一样的原则,直接推栈就好了,但是出栈的时候,考虑到 假如 k 值很大,会做很多重复性的 pop 工作,所以我这里 将 栈的节点从单纯存储读取的字符, 改为 一个 对象,对象保存了读取的字符,和已经读取的字符数量,这样每次 pop 只需要一次即可完成任务
Activity
7777sea commentedon Apr 27, 2020
huangd-d commentedon Apr 27, 2020
AiKunnnnn commentedon Apr 27, 2020
原理跟昨天的题是一样的,不过昨天的题是一次入栈一个,今天是k个。那我们就让它每次入栈 k-1 个,站头的 k-1 个元素的第一个如果与当前准备入栈的元素相同,则代表k个元素是一样的,则无需入栈。
sisterAn commentedon Apr 27, 2020
解答:利用栈
解题思想: 遍历字符串依次入栈,入栈时,判断当前元素与栈头元素是否一致,如果不一致则入栈,如果一致,判断栈头字符是否长度为
k - 1,如果为k-1,即加入该字符时,满足连续相同字符k个,此时,需要栈头出栈,当前字符不进栈,如果小于k-1,则取出栈头字符,加上当前字符,重新入栈代码实现:
时间复杂度:O(n)
空间复杂度:O(n)
leetcode
twinkle77 commentedon Apr 28, 2020
暴力来一波
sisterAn commentedon Apr 28, 2020
这种做法可以,但是它采用循环匹配替换,花费时间较长,需要考虑一下时间复杂度问题
zhaojinzhao commentedon May 7, 2020
var arr = 'pbbcggttciiippooaais'.split(''), k = 2;
var startIndex = 0;
while(startIndex < arr.length) {
var num = 1;
while(arr[startIndex + num] === arr[startIndex] && num < k) {
num++;
}
if (num === k) {
arr.splice(startIndex, num);
startIndex = Math.max(0, startIndex - k + 1);
} else {
startIndex++;
}
}
HanTianPeng commentedon May 10, 2020
qianlongo commentedon Aug 22, 2020
正则 + 递归
Forever17s commentedon Feb 27, 2021
大家来评评理。对于以下测试用例,我输出“is”有什么不对吗
预期结果
"ps"
下面是我的代码
执行过程输出
JohnApache commentedon Apr 29, 2021
和删除相邻重复项是同一个类型,利用栈来存储扫描过的字符,不一样的是该题支持
k个,这个理论上可以按照上一题一样的原则,直接推栈就好了,但是出栈的时候,考虑到 假如k值很大,会做很多重复性的pop工作,所以我这里 将 栈的节点从单纯存储读取的字符, 改为 一个 对象,对象保存了读取的字符,和已经读取的字符数量,这样每次pop只需要一次即可完成任务