C# :: Aufgabe #397

4 Lösungen Lösungen öffentlich

String-Vergleich mit Rücktaste/Backspace

Anfänger - C# von JKooP - 12.05.2021 um 15:38 Uhr
Gegeben sind zwei Strings (Texte) bestehend aus einer Anzahl (<100) Kleinbuchstaben (a-z) und
Backspaces (Rücktastenzeichen) welche hier als Hashtag/Raute (#) dargestellt werden.
Dabei können die Strings unterschiedlicher Länge sein.
Ziel soll es sein zu überprüfen, ob die beiden Strings (s1, s2) identisch sind.

Beispiele:

s1 = ab#c
s2 = ae#c
Lösung: true ("ac" == "ac"), denn Backspace löscht in s1 das b und in s2 das e

s1 = ab##
s2 = e#f#
Lösung: true ("" == ""), denn Backspace löscht in s1 zuerst das b und dann das a und in s2 zuerst das e und dann das f

s1 = a#c
s2 = ac#
Lösung: false ("c" != "a") , denn Backspace löscht in s1 das a und in s2 das c

s1 = ####
s2 = ###a#
Lösung: true

s1 = abcdefg
s2 = abcder#fr#g
Lösung: true

Schreibe eine Methode/Funktion, die für obige Aufgabenstellung als Ergebnis true/false liefert.

Viel Spaß

Lösungen:

vote_ok
von manoloForead (390 Punkte) - 18.05.2021 um 01:38 Uhr
Quellcode ausblenden C#-Code
private bool CompareStrings(string s1, string s2)
{
    // Wahr, wenn beide Strings gleich sind
    return RemoveBackspaces(s1) == RemoveBackspaces(s2);
}

// Helfer-Funktion        
private string RemoveBackspaces(string input)
{
    // Rückgabe-String
    string output = "";

    // Für jeden einzelnen Buchstaben...            
    foreach (var c in input)
    {
        // Wenn der Buchstabe kein '#' ist, dann an den Rückgabe-String anhängen
        if (c != '#')
            output += c;
        // Wennn der Buchstabe ein '#' ist, dann...
        else
        {
            // Wenn der Rückgabe-String mindestens 1 Zeichen enthält, das letzte Zeichen entfernen
            if (output.Length > 0)
                output = output.Substring(0, output.Length - 1);
        }
    }

    return output;
}
vote_ok
von LikeTheShado (60 Punkte) - 18.05.2021 um 12:29 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StringVergleich
{
    public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            string s1 = "asc##w";
            string s2 = "asc##w";
            int trim = 0;
            int anz = 0;
            char x2 = '#';

            foreach (char x in s1)
            {
                if (x != x2)
                {
                    trim++;
                }
                else
                {
                    break;
                }
            }     
            
            foreach(char x in s1)
            {
                if (x == '#')
                {
                    anz++;
                }
            }
            s1 = s1.Remove(trim - anz, anz);
            s1 = s1.Replace("#", "");

            trim = 0;
            anz = 0;
            foreach (char x in s2)
            {
                if (x2 != x)
                {
                    trim++;
                }
                else
                {
                    break;
                }
            }

            foreach (char x in s2)
            {
                if (x == '#')
                {
                    anz++;
                }
            }
            s2 = s2.Remove(trim - anz, anz);
            s2 = s2.Replace("#", "");
           
            if(s1 == s2)
            {
                MessageBox.Show("true");
            }
            else
            {
                MessageBox.Show("false");
            }
        }
    }
}




vote_ok
von JKooP (18070 Punkte) - 21.05.2021 um 21:53 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

var lst = new List<(string s, string t)>
{
    ("ab#c", "ae#c"), ("ab##", "e#f#"), ("a#c", "ac#"), ("####", "###a#"), ("abcdefg", "abcder#fr#g")
};

lst.Select(x => BackspaceCompare(x.s, x.t)).ToList().ForEach(Console.WriteLine);

bool BackspaceCompare(string s, string t)
{
    if (s == t) return true;

    List<char> GetCleaned(string x)
    {
        var l = x.ToList();

        while (l.Contains('#'))
        {
            int i = l.IndexOf('#');
            int t = i != 0 ? 1 : 0;
            l.RemoveRange(i - t, 1 + t);
        }
        return l;
    }

    return GetCleaned(s).SequenceEqual(GetCleaned(t));
}
vote_ok
von ionut (80 Punkte) - 12.07.2021 um 23:08 Uhr
Quellcode ausblenden C#-Code
//s1 durchgehen und die richtigebuchstaben in s1Verarbeitet schreiben. 
            for (int i = 0; i < s1.Length; i++)
            {
                if (s1[0] == ' ')
                {
                    s1 = s1.Remove(i, 1);
                    i = 0;
                }
                else if(s1[i] == ' ')
                {
                    s1 = s1.Remove(i, 1);
                    s1 = s1.Remove(i - 1, 1);

                    i = 0;
                }

                
            }
            //s2 durchgehen und die richtigebuchstaben in s2Verarbeitet schreiben.
            for (int i = 0; i < s2.Length; i++)
            {
                if (s2[0] == ' ')
                {
                    s2 = s2.Remove(i, 1);
                    i = 0;
                }
                else if( s2[i] == ' ')
                {
                    s2 = s2.Remove(i, 1);
                    s2 = s2.Remove(i - 1, 1);
                    i = 0;
                }
            }

            //überprüfen ob beiden überarbeiteten Strings gleich sind.

            if (s1 == s2)
            {
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Die Texte sind gleich!");
            }
            else
            {
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Die Texte sind nicht gleich :(!");
            }