题目大意:
删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:”abbaca”
输出:”ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
提示:
1 <= S.length <= 20000
S
仅由小写英文字母组成。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1047
解题思路分析:
看到这种找相邻相同元素,嵌套相邻相同元素的问题,采用栈来解决再合适不过了。栈具有后入先出的特性,栈顶(最后)的元素永远是上一次(最近)访问过的内容,很方便我们比较相邻下标之间值。
回到本题,遍历字符串中每一个字符,看栈顶元素是否与当前字符相同,相同的话就做出栈操作,不同的话就将当前值入栈。代码如下:
public String removeDuplicates(String S) { Stack<Character> s = new Stack<>(); // 定义一个Stack for(int i=0;i<S.length();i++){ // 遍历每一个字符 char c = S.charAt(i); // 取得当前字符 // 如果栈的元素个数大于0,并且栈顶元素等于当前元素 if(s.size()>0 && c == s.peek()){ s.pop(); // 出栈 }else{ s.push(c); // 将当前元素入栈 } } // 栈中剩下的元素即为答案。 StringBuilder res=new StringBuilder(); while(s.size()>0){ res.append(s.pop()); } // 注意栈的顺序为倒序,因此需要反转字符串 res.reverse(); return res.toString(); }
本题解法运行时间为58ms。
Runtime: 58 ms, faster than 36.62% of Java online submissions for Remove All Adjacent Duplicates In String.
Memory Usage: 38.4 MB, less than 100.00% of Java online submissions for Remove All Adjacent Duplicates In String.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1047-remove-all-adjacent-duplicates-in-string解题思路分析/