描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
public class Main { public static void main(String[] args) { //获取控制台输入字符串 Scanner in = new Scanner(System.in); //将获取的字符串转换为字符数组 char[] si = in.nextLine().toCharArray(); //调用方法进行消除 erase(si); } public static void erase(char[] si) { //声明辅助栈 Stack<Character> sin = new Stack<>(); //对字符数组进行遍历 for (int i = 0; i < si.length; i++) { //如果栈不为空且栈顶元素和当前元素相等,则将栈顶元素出栈 if(!sin.isEmpty()&&sin.peek()==si[i]){ sin.pop(); }else{ //将元素入栈 sin.push(si[i]); } } //遍历完后,判断栈是否为空 if (sin.isEmpty()) { System.out.print(0); //不为空就遍历输出栈中的元素 } else { for (int i = 0; i < sin.size(); i++) { //利用栈中的get方法获取元素 System.out.print(sin.get(i)); } } }
本次实现,主要的还是用栈来解决这个问题,将字符串转换为字符数组,然后用一个for循环来处理,若栈为空就将本次元素加入,不为空就将本次元素和栈顶元素比较,如果相同则取出栈顶元素,不相同就将本次元素加入栈中。遍历完了之后,再看栈中是否还有元素,如果有就遍历输出栈中元素!!!