给定一个仅由英文小写字母组成的字符串,将相邻且相同的两个字符删掉构成新的字符串,重复删除操作直至生成不符合删除条件的字符串并返回。
"bcaac"
"b"
bcaac执行删除操作后变为bcc,再次执行删除操作变为b,此时不再符合删除条件故返回b。
"ab"
"ab"
原串即不符合删除条件,故直接返回。
"bcaaac"
"bcac"
bcaaac执行删除操作后变为 bcac ,此时不再符合删除条件
package main import "strings" /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串 */ func removeDuplicates( s string ) string { stk:=[]string{} for _,ch:=range s{ if len(stk)>0&&stk[len(stk)-1]==string(ch){ stk=stk[:len(stk)-1] }else{ stk=append(stk,string(ch)) } } return strings.Join(stk,"") }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串 */ public String removeDuplicates (String s) { // write code here Stack<Character> stack = new Stack<Character>();//构造字符串栈,该栈内元素不重复 StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) {//从左往右遍历 char a = s.charAt(i);//当前字符 if (!stack.isEmpty() && stack.peek() == a) {//如果当前字符与栈顶字符相等,即两两重复,栈顶元素抛出 stack.pop(); } else {//当字符不两两重复时才入栈 stack.push(a); } } while (!stack.isEmpty()) {//从栈顶开始抛出元素,因为栈是先进后出,所以得到的目标字符串是反过来的 char b = stack.pop(); sb.append(b); } return sb.reverse().toString(); } }
public String removeDuplicates (String s) { // write code here int len = s.length(); Stack<Character> stack = new Stack(); for (int i = 0; i < len; i++) { if (stack.isEmpty()) { stack.push(s.charAt(i)); } else { if (stack.peek() == s.charAt(i)) { stack.pop(); } else { stack.push(s.charAt(i)); } } } if (stack.isEmpty()) { return ""; } else { StringBuffer sb = new StringBuffer(); while (!stack.isEmpty()) { sb.append(stack.pop()); } return sb.reverse().toString(); } }