前端面试题 - 53. 遇到退格字符就删除前面的字符, 遇到两个退格就删除两个字符

301 阅读1分钟

题目

// 比较含有退格的字符串,"<-"代表退格键,"<""-"均为正常字符 
// 输入:"a<-b<-", "c<-d<-",结果:true,解释:都为"" 
// 输入:"<-<-ab<-", "<-<-<-<-a",结果:true,解释:都为"a" 
// 输入:"<-<ab<-c", "<<-<a<-<-c",结果:false,解释:"<ac" !== "c" 

思路:栈+标志量

// 比较含有退格的字符串,"<-"代表退格键,"<""-"均为正常字符 
// 输入:"a<-b<-", "c<-d<-",结果:true,解释:都为"" 
// 输入:"<-<-ab<-", "<-<-<-<-a",结果:true,解释:都为"a" 
// 输入:"<-<ab<-c", "<<-<a<-<-c",结果:false,解释:"<ac" !== "c" 
function fn(str1: string, str2: string) { 

  const doDelete = (str: string) => {
    let flag = 0;// 0 - 正常字符;1 - <;2 - <-
    const stack: string[] = [];
    for(let i = 0; i < str.length; i++) {
      const char = str[i];
      stack.push(char);

      if(char === '<' && !flag) {
        flag += 1
      } else if(flag === 1) {
        if(char === '-') {
          flag += 1
        } else {
          flag -= 1
        }
      }

      if(flag === 2) {
        stack.pop();
        stack.pop();
        stack.pop();
        flag = 0
      }
    }
    // console.log(String(stack))
    return String(stack);
  }

  return doDelete(str1) === doDelete(str2);
}

console.log(fn("a<-b<-", "c<-d<-"))
console.log(fn("<-<-ab<-", "<-<-<-<-a"))
console.log(fn("<-<ab<-c", "<<-<a<-<-c"))

export default fn;