1047. 删除字符串中的所有相邻重复项『简单』

题目来源于力扣(LeetCode

一、题目

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

题目相关标签:栈

提示:

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

二、解题思路

2.1 栈方式——Stack

  1. 遍历字符数组 arr,对于遍历元素首先判断是否在栈顶存在,不存在时,做入栈的操作

  2. 存在时,弹出栈顶元素,并且对当前遍历字符不做入栈的操作

2.2 StringBuilder.delete() 方式

  1. 遍历字符串 S,对于每次遍历的字符都判断是否与字符串中索引前一位元素是否相同

  2. 相同时,通过 StringBuilder 的 delete() 方法,来删除当前字符与前一位相同的字符

  3. 注意:索引也需要减 2,否则可能出现索引越界错误

2.3 栈方式——数组实现

  1. 创建 ans 数组用于存储字符串中的字符元素并进行(操作的)操作,并定义 index 变量用来存储往 ans 数组中添加元素的索引位置

  2. 遍历字符串 S,对于每次遍历的字符都判断是否与字符串中索引前一位元素是否相同

  3. 不相同时,把当前遍历字符添加到 ans 数组中,同时 index 索引位加 1

  4. 两个字符相同时,只需要把 index 索引位减 2,即下次遍历时从减 2 后的索引位开始添加元素

  5. 最后将字符数组转换成字符串,通过 index 索引作为字符数组中有效的元素

三、代码实现

3.1 栈方式——Stack

public static String removeDuplicates(String S) {
    char[] arr = S.toCharArray();

    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < arr.length; i++) {
        if (!stack.empty()) {
            // 判断栈顶元素是否与当前遍历字符相同,相同即代表为两个相邻元素
            if (arr[i] == stack.peek()) {
                // 弹出
                stack.pop();
                continue;
            }
        }
        stack.push(arr[i]);
    }
    StringBuilder sb = new StringBuilder();
    // 栈中元素转字符串
    while (!stack.empty()) {
        sb.append(stack.pop());
    }
    return sb.reverse().toString();
}

3.2 StringBuilder.delete() 方式

public static String removeDuplicates(String S) {
    StringBuilder sb = new StringBuilder(S);
    for (int i = 1; i < sb.length(); i++) {
        // 当前遍历字符与前一字符相同时,说明重复
        if (i > 0 && sb.charAt(i) == sb.charAt(i - 1)) {
            // 删除两个字符,索引分别为:i+1,i
            sb.delete(i - 1, i + 1);
            // 防止索引越界,遍历索引 i 也相应减 2(因删除了两个字符)
            i -= 2;
        }
    }
    return sb.toString();
}

3.3 栈方式——数组实现

public static String removeDuplicates(String S) {
    // 创建数组用于存储字符串中的字符元素并进行操作
    char[] ans = new char[S.length()];
    char[] arr = S.toCharArray();
    // 变量 index 记录往 ans 数组中插入元素的索引
    int index = 0;

    for (int i = 0; i < arr.length; i++) {
        // 判断当前遍历字符是否与 ans 数组中的最后一个字符相同
        if (index > 0 && arr[i] == ans[index - 1]) {
            // 本次遍历元素不插入,且索引 - 1,下次遍历时会前一位索引上元素进行覆盖
            index -= 1;
        } else {
            // 插入新元素,索引后移一位
            ans[index] = arr[i];
            index += 1;
        }
    }
    // 数组转化成字符串,结束索引为 index(不包括)
    return String.valueOf(ans, 0, index);
}

四、执行用时

4.1 栈方式——Stack

4.2 StringBuilder.delete() 方式

4.3 栈方式——数组实现

五、部分测试用例

public static void main(String[] args) {
    String S = "abbaca";  // output:"ca"
    String result = removeDuplicates(S);
    System.out.println(result);
}
posted @ 2020-05-31 19:57  知音12138  阅读(271)  评论(0编辑  收藏  举报