最近面试碰到一道算法题,不算难,但是实现方法有点不太好,就私下来学习总结下!
题目描述:
首先消除字符串中所有的b
,然后再消除所有连续的字符串ac
,使得最终输出的字符串不得包含字符串b
和连续的字符串ac
。
测试用例:
'aabbc' -> 'a'
'aaabbbccc' -> ''
'abcdcba' -> 'dca'
方法一:
- 利用
split('b')
方法,将字符串转化成不含有b
的数组,再通过join('')
转化成字符串; while
循环字符串进行同样的操作去除连续的ac
字符串;
function fn(str) {
let newStr = str.split("b").join("");
while(newStr.indexOf("ac") !== -1) {
newStr = newStr.split("ac").join("")
}
return newStr
}
这种方法虽然可以,但是有投机取巧的嫌疑,这道题的本意是想让用栈的方法来实现,所有推荐使用方法二。
方法二:
- 循环字符串,遇到
b
不进行操作,遇到c
并且栈顶元素是a
,就删除栈顶元素。
function fn(str) {
let result = [];
for (let i = 0; i < str.length; i++) {
if (str[i] == "b") {
continue;
} else if (str[i] == "c" && result[result.length - 1] == "a") {
result.pop();
} else {
result.push(str[i]);
}
}
return result.join("");
}