java用 O(1)空间这个方法,容易挺多bug的…
O(1)空间
- #:删除前一个字符 =》 从后面开始判断(这样可以用跳过的思想)
- 不能使用两次 i- - 来处理 # 的操作,会造成误删了前面的 “#” ,即 “##” 的情况 =》 skipI 、skipJ
- skipI、skipJ 用来攒着,等着下次判断当前位是否是有效位(字母)
- 比较两种情况:①s、t 当前都存在可以比较的字符 ②一个串为空,另一个串还有内容
- 两处while:
class Solution {public boolean backspaceCompare(String s, String t) {int i = s.length() - 1, j = t.length() - 1;// // 需要跳过的步数;避免了两次i--造成误删了前面的“#”,即##的情况int skipI = 0, skipJ = 0;//两个字符串不是同一时间删除完! 比如 ab#、b#ab# =》 ”||“while (i >= 0 || j >= 0) {//持续处理!!!一直处理到:当前位可以比较 or 空串while (i >= 0) {if (s.charAt(i) == '#') {i--;// 攒着:删除有效字符(不能把前面的#删掉了)skipI++;}//当前位不为# =》 需要删除(前面攒的有skipI)、不需要删除else if (skipI > 0) {i--;skipI--;} else {break;}}while (j >= 0) {if (t.charAt(j) == '#') {j--;skipJ++;}else if (skipJ > 0) {j--;skipJ--;} else {break;}}//都不为空=》比较if (i >= 0 && j >= 0) {if (s.charAt(i) != t.charAt(j))return false;} else if (i >= 0 || j >= 0)// 一个空、一个不空return false;//处理下一个字符i--;j--;}return true;}
}
O(n)空间
toCharArray,用 有效索引k 来从头赋值数组
class Solution {public boolean backspaceCompare(String s, String t) {int k1=0;char[] c1=s.toCharArray();for (int i = 0; i < c1.length; i++) {if(c1[i]=='#'){if(k1!=0)k1--;}else{c1[k1++]=c1[i];}}int k2=0;char[] c2=t.toCharArray();for (int i = 0; i < c2.length; i++) {if(c2[i]=='#'){if(k2!=0)k2--;}else{c2[k2++]=c2[i];}}if(k1!=k2)return false;else{for (int i = 0; i < k1; i++) {if(c1[i]!=c2[i])return false;}}return true;}
}