题目描述
描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
示例1
输入:
abbc
输出:
ac
示例2
输入:
abba
输出:
0
示例3
输入:
bbbbb
输出:
b
算法原理
核心思想:栈
从左往右遍历字符串,将字符与栈顶元素作比较(第一个字符直接入栈即可),如果字符与栈顶元素不同,则入栈,反之则出栈
此处我们用Java的StringBuilder类来实现栈的模拟即可
代码详解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char[] s = in.next().toCharArray();
StringBuilder st = new StringBuilder();
for(int i = 0;i<s.length;i++){//遍历数组
char ch = s[i];
if(st.length() != 0 && ch == st.charAt(st.length()-1)){
//出栈
st.deleteCharAt(st.length()-1);
}
else{
//进栈
st.append(ch);
}
}
System.out.println(st.length() == 0 ? 0 : st.toString());
}
}
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
如果对客官有帮助的话,点赞关注走一走,感谢支持!!!