比较含退格的字符串

给定 ST 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

示例 1:

输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。

示例 2:

输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。

示例 3:

输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。

示例 4:

输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

提示:

  1. 1 <= S.length <= 200
  2. 1 <= T.length <= 200
  3. ST 只含有小写字母以及字符 '#'

根据这一题,掌握数据结构中栈的使用

题目分析:

题目的意思是,在两个字符串中,对于每一个字符串,如果存在’#‘符号,并且它前面有字符,则删除它前面的字符,’#‘号也删除;如果’#‘前面没有字符,则只删除’#'号;之后再比较两个字符串是不是相等(即剩余的元素相同)。

很明显,此题可以使用栈的知识解决:扫描每一个字符串,当读到的字符串中的字符不是’#‘的时候,字符入栈;当读到’#'的时候,如果栈不为空(很重要,千万别忘记判断,如果不进行栈空的判断,当栈空的时候如果进行pop()操作则会报错)的时候,删除栈顶元素;最后对比两个字符串是不是相等。

刚开始,我使用两个栈来进行操作,可以看出要进行两个for循环操作:

     public boolean backspaceCompare(String S, String T)
      {
          Stack<Character> stack1 = new Stack<>();
          Stack<Character> stack2 = new Stack<>();
  
          for (char c : S.toCharArray())
          {
              if (c != '#')
                 stack1.push(c);
             else
             {
                 if (!stack1.isEmpty())
                     stack1.pop();
             }
         }
 
         for (char c : T.toCharArray())
         {
             if (c != '#')
                 stack2.push(c);
             else
             {
                 if (!stack2.isEmpty())
                     stack2.pop();
             }
         }
 
         return stack1.equals(stack2);
     }

之后我选择使用JAVA泛型,将方法抽象出来,只使用了一次for循环,减少了代码量:

      public boolean backspaceCompare(String S, String T)
      {
          return compute(S).equals(compute(T));
      }
  
      private Stack<Character> compute(String s)
      {
          Stack<Character> stack = new Stack<>();
 
         for (char c : s.toCharArray())
         {
             if (c != '#')
                 stack.push(c);
             else
             {
                 if (!stack.isEmpty())
                     stack.pop();
             }
         }
 
         return stack;
      }

主函数:

  public static void main(String[] args)
     {
          T8 t = new T8();
 
          String S1 = "a##b";
          String T1 = "#a#b";
          System.out.println(t.backspaceCompare(S1, T1));
  
          String S2 = "a#c";
         String T2 = "b";
         System.out.println(t.backspaceCompare(S2, T2));
 
     }

运行结果:

true
false

你可能感兴趣的:(数据结构,数据结构与算法2018)