一、题目

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。
之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

提示:

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

二、题解

  • 题解1:PHP自带的函数str_replace

将 aa 到 zz 的 26 种重复项放入集合中,将字符串中这些重复项替换成空字符串。

function removeDuplicates($S) {
$vowels = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'll', 'mm', 'nn',
'oo', 'pp', 'qq', 'rr', 'ss', 'tt', 'uu', 'vv', 'ww', 'xx', 'yy', 'zz']; while (strlen($S) >= 2) {
$S = str_replace($vowels, "", $S);
if ($S == str_replace($vowels, "", $S)) {
break;
}
} return $S;
}
  • 题解2:出队入栈结合

首先把字符串转化为数组,可以把这个字符串数组当做一个队列;

设置一个栈,判断字符串数组的队头元素和栈顶元素是否相等,如果不相等,就将字符串数组的队首元素出队,压入栈中,

反之,则将队首元素出队,同时将栈顶元素弹出。

时间复杂度:O(N),空间复杂度:O(N)。

function removeDuplicates($S) {
if (strlen($S) <= 1) {
return $S;
} $stack = [];
$arr = str_split($S);
while (!empty($arr)) {
if (empty($stack)) {
$stack[] = array_shift($arr);
} else {
if (current($arr) == end($stack)) {
array_shift($arr);
array_pop($stack);
} else {
$stack[] = array_shift($arr);
}
}
}
return implode("", $stack);
}

最新文章

  1. swing with transformjs
  2. 用DirectX实现魔方(一)
  3. php返回json数据简单实例
  4. opencl初探-sobel检测
  5. UI 网络程序
  6. 【学习笔记】虚拟机安装Mac系统
  7. C#中常见的winform控件命名规范
  8. uva 993 Product of digits (贪心 + 分解因子)
  9. 50道经典的JAVA编程题(目录)
  10. 史上最简单的带流控功能的http server
  11. java的LinkedList的用法
  12. MYSQL 命令行导入导出
  13. Spark SQL Catalyst源代码分析之TreeNode Library
  14. Java 新特性(4) - JDK 8 新特性
  15. 利用XAMPP本地搭建WordPress博客
  16. 【RL-TCPnet网络教程】第39章 RL-TCPnet之TFTP服务器
  17. CSS3_伸缩盒模型_弹性布局_等分布局_flex 布局
  18. BZOJ4133 : Answer的排队
  19. 『Python』库安装
  20. prometheus 表达式

热门文章

  1. 大马提权详细过程webshell到提权
  2. 7-19 计算有n个字符串中最长的字符串长度 (40 分)
  3. nodejs通过响应回写的方式渲染页面资源
  4. 一文快速入门Shell脚本_了解Sheel脚本基本命令
  5. win10查看本机mac地址的详细操作
  6. idea 2018.1激活方法
  7. 【MVC】使用Jquery缓存数据
  8. Js中的For循环详解
  9. Swift中的感叹号( ! )与问号( ? )之谜
  10. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐