C# :: Aufgabe #397
4 Lösungen
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ß
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:
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; }
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"); } } } }
NET 5.x; C# 9.x; VS-2019
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)); }
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 :(!"); }