dxxbjl 发表于 2023-3-28 19:50

java - 栈 - 点击消除相邻重复的字母

给出一个字符串,每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
      但相同而不相邻、不相同的相邻字母都是不可以被消除的。如果一直点击,字符串的最终形态是什么?
整理要求:
1、一个字符串
2、消除相邻的两个元素
3、打印最终元素
思路:把它看成入栈与出栈,如果相邻的两次入栈元素相同,就让栈顶元素出栈,最后打印结果。
public static void main(String[] args) {
   
      Stack<Character> stack = new Stack();

      Scanner sc =new Scanner(System.in);

      String str = sc.nextLine();

      for(int i =0;i<str.length();i++){
            char ch =str.charAt(i);
            if(stack.isEmpty() || ch !=stack.peek()){
                stack.push(ch);
            }else if(ch == stack.peek()){
                stack.pop();
            }
      }
      String str2 ="";
      //输出if(stack.isEmpty()){//如果是空栈,打印0
            System.out.println(0);
      }else{//如果不是空栈,循环出栈,反转字符串
            
            while(!stack.isEmpty()){
               str2 += stack.pop(); //将出栈的元素赋值给 str2,但这个str2是出栈的顺序,是反着的
            }
            
      }
      
      String str3 ="";    //使用str3来反转str2
      for(int i=str2.length()-1;i>=0;i--){
            str3 += str2.charAt(i);
      }
      System.out.println(str3);   //打印结果
    }

17689207110 发表于 2023-3-29 09:38

import java.util.*;

public class StringClicker {
    public static void main(String[] args) {
      String str = "abbc";
      String result = click(str);
      System.out.println(result); // 输出:ac
    }

    public static String click(String str) {
      Stack<Character> stack = new Stack<>();
      for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (!stack.isEmpty() && stack.peek() == c) {
                stack.pop(); // 弹出相邻相同字母
            } else {
                stack.push(c); // 压入不同或相邻不同字母
            }
      }
      StringBuilder sb = new StringBuilder();
      while (!stack.isEmpty()) {
            sb.append(stack.pop()); // 从栈底到栈顶组成最终形态的字符串
      }
      return sb.reverse().toString(); // 反转字符串,从左到右是原字符串中从右到左的顺序
    }
}

jianghan4733 发表于 2023-3-28 21:32


感谢楼主的分享

Pojawa 发表于 2023-3-29 08:21

感谢技术分享,这个思路耐人寻味,但是讲真的我想象不到这个逻辑的应用场景是什么,可能是做游戏会用到吧?

wjzycxdhh 发表于 2023-3-29 09:42

感谢分享

林伊轩 发表于 2023-3-29 10:07

17689207110 发表于 2023-3-29 09:38
import java.util.*;

public class StringClicker {


看到原文想说str2 str3不应该用string类型
{:301_993:}

zongze3055 发表于 2023-3-29 11:49

感谢分享

zha3750 发表于 2023-3-29 14:29

17689207110 发表于 2023-3-29 09:38
import java.util.*;

public class StringClicker {


感谢楼主的分享

moonmicah 发表于 2023-3-29 14:39

感谢楼主的分享
页: [1]
查看完整版本: java - 栈 - 点击消除相邻重复的字母