近期科学家们在熬夜写论文报告,可是不争气的键盘出现了一系列的问题,有的时候点一下键盘往外出两个字符,有的时候只出一个。恰巧键盘的退格键坏了。
你知道科学家们都是有怪脾气的,他自己打出一篇文章,他就像恢复成原来的.
科学家满意的字符串是这样的,如果字符串中有相临的两个字符相同就消除这两个字符,形成一个新的字符串,如果新的字符串还有相邻的字符并且相同,再消除。一直到没有相邻的两个字符相同为止。
一个字符串,长度不大于2*10^5,只包含小写字母
令科学家满意的字符串。
reallazy
rezy
对于样例中的字符串这样变化的,reallazy -> reaazy -> rezy.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
今天的时候被同学来问了一下这个题0.0。
仔细想想也就是一个压栈弹栈的问题,写个栈也就过了23333
(注意读题,只可能有两个相同字母相邻的情况,不用考虑太多233333)
代码如下:
C:
1 #include<stdio.h> 2 3 #define MAX 200001 4 5 struct Stack{ 6 char sz[MAX]; 7 long index; 8 }S; 9 10 int main() 11 { 12 S.index = 0; 13 char ip = 0; 14 while (EOF != scanf("%c", &ip)) 15 { 16 if (ip != S.sz[S.index - 1]) 17 S.sz[S.index++] = ip; 18 else 19 S.index--; 20 } 21 for (int i = 0; i < S.index; i++) 22 { 23 putchar(S.sz[i]); 24 } 25 return 0; 26 }
C++:
1 #include<iostream> 2 #include <deque> 3 4 using namespace std; 5 6 int main() 7 { 8 ios::sync_with_stdio(false); 9 deque<char> d; 10 char ip; 11 while (cin >> ip) 12 { 13 if (d.size() && ip == d.back()) 14 d.pop_back(); 15 else 16 d.push_back(ip); 17 } 18 while (d.size()) 19 { 20 cout << d.front(); 21 d.pop_front(); 22 } 23 return 0; 24 }
Java:
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 int a = 0; 6 Scanner sc = new Scanner(System.in); 7 char[] sz = new char[200001]; 8 int index = 0; 9 int i = 0; 10 String str; 11 while(sc.hasNext()) 12 { 13 str = sc.next(); 14 while(index < str.length()) 15 { 16 if(i > 0 && str.charAt(index) == sz[i - 1]) 17 { 18 i--; 19 } 20 else 21 { 22 sz[i++] = str.charAt(index); 23 } 24 index++; 25 } 26 for(int j = 0; j < i; j++) 27 { 28 System.out.print(sz[j]); 29 } 30 i = 0; 31 index = 0; 32 } 33 } 34 }
碎碎念:java一次只能处理65534个字符, 如果只跑一次会WA掉。。。。。
原文:https://www.cnblogs.com/lost-legacy/p/12112008.html