1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public String removeStars(String s) { StringBuilder ans = new StringBuilder(); int starCount = 0; for (int i = s.length() - 1; i >= 0; i--) { if (s.charAt(i) == '*') { starCount += 1; } else { if (starCount == 0) { ans.append(s.charAt(i)); } else { starCount -= 1; } } } return ans.reverse().toString(); } }
|
倒着遍历. 很像之前有道题, 就是#表示backspace那道题.
时间复杂度: O(n)
空间复杂度: O(n) 因为用了stringbuilder.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public String removeStars(String s) { int left = 0, right = 0; StringBuilder ans = new StringBuilder(s); while (right < s.length()) { if (s.charAt(right) != '*') { ans.setCharAt(left, s.charAt(right)); left += 1; } else { left -= 1; } right += 1; } return ans.substring(0, left); } }
|
还有种写法, 双指针, 也挺有意思的. 但是我在想如果很多***呢? 题目约束就是肯定有东西和它抵消.
思路就是right遇到不是星的, left这个位置就放这个right指向的这个char. 然后更新left和right, 如果right指向的是星, 那么left这边就要被抵消掉一个, 于是left -= 1. left始终指向的是下一个right找到的非星char的位置. 因此最后, 我们取(0, left), 也就是left左边都是放好的, 就取它们.
时间复杂度: O(n)
空间复杂度: O(n) 如果是c++, 可以在string上改东西, 那时间复杂度就是O(1)了.