题目来源
题目描述
题目解析
使用栈
题目的关键在于 删除重复项,因此重点在于找到所有重复项,包含 因为删除而产生的重复项,因此可以使用栈实现。
-
每次添加时比较是否与栈顶元素相同
-
若相同则删除栈顶元素且不插入
-
若不相同则插入新元素
c++
下面仅仅用于练习栈,因为会超时
#include <stack>
#include <string>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
string removeDuplicates(string s) {
std::stack<char > stack;
for (char c : s) {
if(stack.empty() || stack.top() != c){
stack.push(c);
}else{
stack.pop();
}
}
string str;
while (!stack.empty()){
char peek = stack.top();
stack.pop();
str = peek + str;
}
return str;
}
int main(int argc,char **argv){
std::cout << removeDuplicates("abbaca");
return 0;
}
C++语言正确的写法是string容器本身就实现了类似栈的操作。
string removeDuplicates(string s) {
string str;
for (char c : s) {
if(str.empty() || str.back() != c){
str.push_back(c);
}else{
str.pop_back();
}
}
return str;
}
java
package com.oceanstar;
import java.util.Stack;
public class Solution {
public static String removeDuplicates(String S) {
Stack<Character> stack = new Stack<>();
char[] cs = S.toCharArray();
for (int i = 0; i < cs.length; i++){
if (stack.empty() || stack.peek() != cs[i]){
stack.push(cs[i]);
}else {
stack.pop();
}
}
StringBuilder stringBuilder = new StringBuilder();
for (Character c: stack){
stringBuilder.append(c);
}
return stringBuilder.toString();
}
public static void main(String[] args) {
System.out.println(removeDuplicates("abbaca"));
}
}
使用字符串
package com.oceanstar;
public class Solution {
public static String removeDuplicates(String S) {
StringBuilder stringBuilder = new StringBuilder();
char[] cs = S.toCharArray();
int length = 0;
for (Character c : cs){
if (length != 0 && stringBuilder.charAt(length - 1)== c){
stringBuilder.deleteCharAt(length - 1);
length--;
}else{
stringBuilder.append(c);
length++;
}
}
return stringBuilder.toString();
}
public static void main(String[] args) {
System.out.println(removeDuplicates("abbaca"));
}
}