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); //打印结果
} 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(); // 反转字符串,从左到右是原字符串中从右到左的顺序
}
}
感谢楼主的分享 感谢技术分享,这个思路耐人寻味,但是讲真的我想象不到这个逻辑的应用场景是什么,可能是做游戏会用到吧? 感谢分享 17689207110 发表于 2023-3-29 09:38
import java.util.*;
public class StringClicker {
看到原文想说str2 str3不应该用string类型
{:301_993:} 感谢分享 17689207110 发表于 2023-3-29 09:38
import java.util.*;
public class StringClicker {
感谢楼主的分享
感谢楼主的分享
页:
[1]