📌  相关文章
📜  处理退格字符后检查两个字符串是否相等

📅  最后修改于: 2021-09-06 11:34:01             🧑  作者: Mango

给定两个字符串s1 和 s2 ,让我们假设在键入字符串遇到了一些由 # 表示的退格。任务是确定处理退格字符后的结果字符串是否相等。

例子:

Input: s1= geee#e#ks, s2 = gee##eeks 
Output: True 
Explanation: Both the strings after processing the backspace character
becomes "geeeeks". Hence, true.

Input: s1 = equ#ual, s2 = ee#quaal#
Output:  False
Explanation: String 1 after processing the backspace character
becomes "equal" whereas string 2 is "eequaal". Hence, false.


方法:
为了解决上面提到的问题,我们必须观察到,如果第一个字符是’#’,那就是肯定没有最初输入的字符,因此我们不执行任何操作。当我们遇到除 ‘#’ 以外的任何字符,我们就在当前索引之后添加该字符。当我们遇到 ‘#’ 时,我们将一个索引移回,因此我们没有删除字符,而是忽略它。然后最后通过从头到尾比较每个字符来比较两个字符串。

下面是上述方法的实现:

C++
/* C++ implementation to Check if
two strings after processing
backspace character are equal or not*/
 
#include 
using namespace std;
 
// function to compare the two strings
bool compare(string s, string t)
{
    int ps, pt, i;
 
    /* the index of character in string which
       would be removed when
       backspace is encountered*/
    ps = -1;
 
    for (i = 0; i < s.size(); i++) {
 
        /* checks if a backspace is encountered or not.
            In case the first character is #,
            no change in string takes place*/
        if (s[i] == '#' && ps != -1)
 
            ps -= 1;
 
        /* the character after the # is added
         after the character at position rem_ind1 */
        else if (s[i] != '#') {
 
            s = s[i];
            ps += 1;
        }
    }
 
    pt = -1;
 
    for (i = 0; i < t.size(); i++) {
        /* checks if a backspace is encountered or not */
        if (t[i] == '#' && pt != -1)
            pt -= 1;
 
        else if (t[i] != '#') {
 
            t[pt + 1] = t[i];
 
            pt += 1;
        }
    }
 
    /* check if the value of
        rem_ind1 and rem_ind2
        is same, if not then
        it means they have different
        length */
    if (pt != ps)
 
        return false;
 
    /* check if resultant strings are empty */
    else if (ps == -1 && pt == -1)
 
        return true;
 
    /* check if each character in the resultant
       string is same */
    else {
 
        for (i = 0; i <= pt; i++) {
 
            if (s[i] != t[i])
 
                return false;
        }
        return true;
    }
}
 
// Driver code
int main()
{
    // initialise two strings
    string s = "geee#e#ks";
    string t = "gee##eeks";
 
    if (compare(s, t))
 
        cout << "True";
    else
 
        cout << "False";
}


Java
// Java implementation to Check if 
// two strings after processing 
// backspace character are equal or not
import java.util.*;
import java.lang.*;
 
class GFG{
  
// Function to compare the two strings
static boolean compare(StringBuilder s,
                       StringBuilder t)
{
    int ps, pt, i;
   
    // The index of character in string
    // which would be removed when
    // backspace is encountered
    ps = -1;
   
    for(i = 0; i < s.length(); i++)
    {
         
        // Checks if a backspace is encountered
        // or not. In case the first character
        // is #, no change in string takes place
        if (s.charAt(i) == '#' && ps != -1)
            ps -= 1;
   
        // The character after the # is added
        // after the character at position rem_ind1
        else if (s.charAt(i) != '#')
        {
            s.setCharAt(ps + 1, s.charAt(i));
            ps += 1;
        }
    }
   
    pt = -1;
   
    for(i = 0; i < t.length(); i++)
    {
         
        // Checks if a backspace is
        // encountered or not
        if (t.charAt(i) == '#' && pt != -1)
            pt -= 1;
   
        else if (t.charAt(i) != '#')
        {
            t.setCharAt(pt + 1, t.charAt(i));
             
            pt += 1;
        }
    }
   
    // Check if the value of rem_ind1 and
    // rem_ind2 is same, if not then it
    // means they have different length
    if (pt != ps)
        return false;
   
    // Check if resultant strings are empty
    else if (ps == -1 && pt == -1)
        return true;
   
    // Check if each character in the
    // resultant string is same
    else
    {
        for(i = 0; i <= pt; i++)
        {
            if (s.charAt(i) != t.charAt(i))
                return false;
        }
        return true;
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    // Initialise two strings
    StringBuilder s = new StringBuilder("geee#e#ks");
    StringBuilder t = new StringBuilder("gee##eeks");
     
    if (compare(s, t))
        System.out.print("True");
    else
        System.out.print("False");
}
}
 
// This code is contributed by offbeat


输出:

True




时间复杂度: O(N)
辅助空间: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live