山西商城网站建设,html模板引擎,河北石家庄的大学,南京汽车集团网站建设1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S#xff0c;重复项删除操作会选择两个相邻且相同的字母#xff0c;并删除它们。 在 S 上反复执行重复项删除操作#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…
1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母并删除它们。 在 S 上反复执行重复项删除操作直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 输入abbaca 输出ca 解释 例如在 abbaca 中我们可以删除 bb 由于两字母相邻且相同这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 aaca其中又只有 aa 可以执行重复项删除操作所以最后的字符串为 ca。 方法一使用容易理解的栈
思路 1.将字符串转换为字符数组依次遍历 2.创建栈 3.开始栈中为空将字符压栈。 4.将待压入栈的字符与栈顶元素比较相同时将栈顶元素弹出不同时将待压栈字符压栈。 5.遍历结束返回栈中元素的倒序。 class Solution {public String removeDuplicates(String s) {if (snull||s.length()1){return s;}char[] chars s.toCharArray();StackCharacter stack new Stack();for (int i 0; i s.length(); i) {if (!stack.isEmpty()stack.peek()chars[i]){stack.pop();}else{stack.push(chars[i]);}}StringBuilder res new StringBuilder();while (!stack.isEmpty()){res.append(stack.pop());}return String.valueOf(res.reverse());
//两种都可以// while (!stack.isEmpty()){// res.insert(0,stack.pop());// }//return String.valueOf(res);}
} 注StringBuffer.insert: 在指定位置把任意类型的数据插入到字符串缓冲区里面并返回字符串本身。 方法二使用数组
思路两个索引一个索引遍历j一个索引比较i当相同时将遍历索引后的字符覆盖相同的字符更新字符串详细步骤如下图 public String removeDuplicates(String s) {if (snull||s.length()1){return s;}char[] chars s.toCharArray();int i 0;for (int j 1; j chars.length; j) {if (i-1||chars[i]!chars[j]){chars[i]chars[j];}else {i--;}}return new String(Arrays.copyOfRange(chars,0,i1)); 注
Arrays.copyOfRange是一个数组拷贝方法可以将一个数组中的一部分拷贝到一个新数组中。
int[] original new int[] {1, 2, 3, 4, 5};
int[] copied Arrays.copyOfRange(original, start, end); original拷贝的源数组start是拷贝的起始位置包含end是拷贝的结束位置不包含。