X

LEETCODE 1047. Remove All Adjacent Duplicates In String解题思路分析

题目大意:

删除字符串中的所有相邻重复项

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

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

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

示例:

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

提示:

  1. 1 <= S.length <= 20000
  2. 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解题思路分析/
Categories: leetcode
kwantong: