算法题:消除字符串中全部的b和连续的ac
最近碰到了一道面试题,虽然不难但是临试没想出好的解法,记录下来以作分享。
题目:消除字符串中全部的b和连续的ac
用例:
'aabbc' -> 'a''aaabbbccc' -> '''abcdcba' -> 'dca'
注意结合用例理解这个题目的意思,转化后的字符串中不能有任何b和连续的ac,而不是仅对初始值进行一次转换。
暴力法
既然最后得到的字符串中不能有任何b和连续的ac,那么我们可以很容易地想到使用正则连续地进行处理,直到处理前后的字符串相同,可以很容易地写出下面的代码:
function solution (str) {
const reg = /ac|b/g
let strCopy = str
do {
str = strCopy
strCopy = str.replace(reg, '')
} while (strCopy !== str)
return strCopy
}
但是暴力法显然不够好,它每次重复地去执行替换,对于aaaaaccccc这种字符串,需要执行5次。
那么有没有更好的方法呢?通过观察我们发现其实需要替换的字符序列必定符合{n个a}{m个b}{n个c}(m, n不都为0)这种格式。b我们可以先不去管它,先从格式开头的a入手。那么如果找到了a,怎么知道后面的字符序列中有没有c出现呢?而c出现的个数是否能跟a的个数匹配呢?我们可以先保存连续a的数量,然后如果后面出现了符合格式的c,则减少a的个数,直到a耗尽或者格式匹配失败。
存储a的解法
function solution(str) {
let countA = 0 // 连续a的个数
let result = ''
for (let i = 0; i < str.length; i++) {
if (str[i] === 'a') {
countA++
} else if (str[i] === 'b') {
continue
} else if (str[i] === 'c') {
if (countA === 0) {
result += 'c'
} else {
countA--
}
} else {
// 遇到其他字符,则保存的a需要释放
while (countA) {
result += 'a'
countA--
}
result += str[i]
}
}
// 最后需要释放所有保存的a
while (countA) {
result += 'a'
countA--
}
return result
}
存储a的解法有点类似于栈,遇到a入栈,遇到c出栈,遇到abc之外的字符排空栈。
这是一种时间复杂度O(n)的解法,但是在遇到类似aaaaaad这种字符串的时候,它还不够好,因为最后保存的a都要释放出来,有额外的时间开销。
双指针的解法
这是本题较好的一种解法,设两个指针cur和loc分别从头开始出发,cur每次移动一格,另一个指针loc保留当前的操作位置,如果cur指向的字符是c且loc指向的是a,则将loc回移一位(ac抵消了),如果遇到其他非b的字符,则将loc处的字符置为cur处的字符,一直进行直到到cur到达字符串尾部,此时取字符串开头到loc指针之间的子串即为本题的解。这种解法妙就妙在loc处的字符是即时更新的,一些边界条件都自动消除了。
画一个图更好理解一点,比如有字符串abeabcdaabbcg,它经过处理后应该得到aedag,下面是操作过程的图解:

这种方法在C++, Java中是可以实现in-place更新的,但Javascript字符串是不可变的,所以体现不出来。
function solution(str) {
let result = str.split('')
let location = -1
for (let i = 0; i < str.length; i++) {
let cur = str[i]
if (cur === 'c' && location >= 0 && result[location] === 'a') {
location --
} else if (cur !== 'b') {
result[++location] = cur
}
}
return result.slice(0, location + 1).join('')
}
最后做个技术总结,这道题难度不大,考察的是对字符串算法的理解,双指针、栈、动态规划等思想在字符串算法问题中还是有很多应用的,还是要通过学习去总结归纳。
算法题:消除字符串中全部的b和连续的ac的更多相关文章
- 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。
实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 前端与算法 leetcode 387. 字符串中的第一个唯一字符
目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...
- C语言:判断t所指字符串中的字母是否由连续递增字母组成。-判断一个输入的任何整数n,是否等于某个连续正整数序列之和。-将一副扑克牌编号为1到54,以某种方式洗牌,这种方式是将这副牌分成两半,然后将他们交叉,并始终保持编号1的牌在最上方。
//判断t所指字符串中的字母是否由连续递增字母组成. #include <stdio.h> #include <string.h> void NONO(); int fun( ...
- 第5题 查找字符串中的最长回文字符串---Manacher算法
转载:https://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一 ...
- IT公司100题-25-求字符串中的最长数字串
问题描述: 实现一个函数,求出字符串中的连续最长数字串.例如输入”12345cbf3456″,输出”12345″. 函数原型为: void conti_num_max( const char * sr ...
- 《剑指offer》第五十题(字符串中第一个只出现一次的字符)
// 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出 // 'b'. #include & ...
- Java入门:基础算法之从字符串中找到重复的字符
本程序演示从一个字符串中找出重复的字符,并显示重复字符的个数. import java.util.HashMap; import java.util.Map; import java.util.Set ...
- 【leetcode 简单】 第八十三题 反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leet ...
- (算法)判断字符串中是否包含HelloWorld
题目: 给定某字符串,判断该字符串中是否包含HelloWorld,出现HelloWorld不一定要连续,但顺序不变,如“HeByello,ByeWorByeld”就包含“HelloWorld”. 思路 ...
随机推荐
- yolov5s yolov8n 在自己数据集上测试比较(640*640)
yolov5s -> 0.5map: 96.5 -> ncnn:75ms yolov8n -> 0.5map: 94.1 -> ncnn:52ms
- 微信小程序-关闭某个页面分享
方式一: wx.hideShareMenu(); 方式二:
- ES得分
一.概念 1.ES主要用于搜索 2.搜索要把更有相关性的结果展示出来 3.对一个文档评分,相关性越大,评分越高 4.打分的本质是排序 二.评分规则 1.ES5之前,默认评分规则是TF-IDF,这是信息 ...
- REMOTE HOST IDENTIFICATION HAS CHANGED!服务器重置后远程连接不上
问题: 解决: 本地打开shell,重置key
- kaola
考拉布局 CSS <style> * { margin: 0; padding: 0; } body { background-color: #f5f5f5; } .clearfix:af ...
- k8s_使用k8s部署博客系统deployment(四)
mysql deployment 前面的nfs pv pvc secret configmap service等k8s对象已经创建好了,准备工作已经完成:现在可以开始准备deployment配置文件 ...
- SICP 笔记:环境配置
SICP 笔记:环境配置 记录学习<算机的程序的构造和解释>的笔记. 环境配置 SICP 里面使用的语言是一种 Lisp 的变体 Scheme. 使用 DrRacket 作为 IDE 来进 ...
- RSA 非对称加密
原文链接:https://www.jianshu.com/p/d56a72013392 RSA 是一种非对称加密算法,在实际业务中经常使用此算法对数据进行加密.但是它的加解密速度较慢,不太适用于高并发 ...
- node_modules/canvas npm ERR! command failed
Installing packages. This might take a couple of minutes.Installing react, react-dom, and react-scri ...
- 像MIUI一样做Zabbix二次开发(6)——应用场景和规划
其他使用场景 监控做为一个重要的管理手段,存在很多的使用场景,简单列举我们现在碰到的: 1. 系统集成 事件管理流程集成:配置管理集成,自动CI获取,提高CMDB准确.实时性:知识库集成,提高 ...