Eine kleine Übungsaufgabe für mich, die es zu lösen gab. Es sollte heraus gefunden werden, ob es sich bei einem String um ein Palindrom handelt.

Mein Lösungsansatz lautet wie folgt:
Ich befreie zunächst die Buchstaben von Sonder- und Leerzeichen und konvertiere alle Zeichen zu Kleinbuchstaben. Dann durchlaufe ich eine for-Schleife mit eine Länge des Stringparameters.

Ich zerlege den String in ein CharArray und vergleiche innerhalb der Schleife, den vorderen mit den letzten Buchstaben. Sind diese gleich wird der nächste vordere und der nächste hintere Buchstabe verglichen. Das geht so lange bis diese sich in der Mitte treffen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static class ExtensionMethods
{
    public static bool IsPalindrome(this string value)
    {
        //von Leer- und Sonderzeichen befreien
        value = value.ToLower().RemoveSpecialCharacters();
 
        int minValue = 0;
        int maxValue = value.Length - 1;
 
        var charArray = value.ToCharArray();
 
        for (int i = 0; i < value.Length - 1; i++)
        {
            if (charArray[minValue] == charArray[maxValue])
            {
                minValue++;
                maxValue--;
                continue;
            }
            else
                return false;
        }
        return true;
    }
 
    public static string RemoveSpecialCharacters(this string value)
    {
        return Regex.Replace(value, @"[^a-zA-Z0-9]", string.Empty);
    }
}

Verwendung:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Program
{
    static void Main(string[] args)
    {
        PalindromFactory factory = new PalindromFactory();
        var palindrome = factory.GetPalindrome();
        string output = "{0} ist {1}ein Palindrom";
 
        foreach (var palindrom in palindrome)
        {
            Console.WriteLine(String.Format(output, palindrom, palindrom.IsPalindrome() ? "" : "k"));
        }
 
        var palindromSaetze = factory.GetPalindromSaetze();
        foreach (var palindrom in palindromSaetze)
        {
            Console.WriteLine(String.Format(output, palindrom, palindrom.IsPalindrome() ? "" : "k"));
        }
    }
}

Ich hoffe ich habe nichts vergessen, getestet jedoch habe ich diese Methode mit der Liste deutscher Palindrome aus Wikipedia. Nicht-Palindrome natürlich mit einbegriffen : )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/// Stellt eine Sammlung von Palindrome und Palindromsätze bereit
/// Quelle Wikipedia
/// http://de.wikipedia.org/wiki/Liste_deutscher_Palindrome
public class PalindromFactory
{
    private List<string> Palindrome { get; set; }
 
    public List<string> GetPalindrome()
    {
        Palindrome = new List<string>
        {
            "Aha",
            "Amokoma",
            "Amoralaroma",
            "Anina",
            "Anna",
            "Annasusanna",
            "Aua",
            "Bob",
            "Bub",
            "Burggrub",
            "Biggle", //kein Palindrom
            "Mario", //kein Palindrom
            "Mongognom",
            "Nebelleben",
            "neben",
            "Neffen",
            "nennen",
            "netten",
            "netzten",
            "Neozoen",
            "nun",
            "Omo",
            "Otto",
            "Priebe" //kein Palindrom
            };
 
        return Palindrome;
    }
 
    public List<string> GetPalindromSaetze()
    {
        Palindrome = new List<string>
        {
            "Die Liebe fleht: Helfe bei Leid!",
            "Die Liebe geht, hege Beileid!",
            "Die Liebe, ist sie Beileid?",
            "Die Liebe ist Sieger, rege ist sie bei Leid.",
            "Die Liebe ist Sieger, stets rege ist sie bei Leid.",
            "Die Niere bot Komik: nass sank im Oktober ein Eid.",
            "Die Rede — ist sie der Eid?",
            "Dreh Magiezettel um, Amulette zeig am Herd!",
            "Du, erfror Freud?",
            "Der Fred",
            "Eine güldne, gute Tugend: Lüge nie!",
            "Eine Horde bedrohe nie!",
            "Eine Hure ruhe nie.",
            "Eine Note betone nie.",
            "Eine so Kesse kose nie.",
            "Eine treue Familie bei Lima feuerte nie.",
            "Einhorn roh? Nie!",
            "Eins nutzt uns: Amore. Die Rederei da, die Rederei der Omas nutzt uns nie.",
            "Eis feil! Ei, wo Eis feil lief sie, o wie lief sie.",
            "Elietta hat Teile.",
            "Ella rüffelte Detlef für alle.",
            "Elly biss Sibylle.",
            "Emma, behend 'ne Hebamme!",
            "Emma, so litt Tilos Amme!",
            "Emmas Amme",
            "Er habe nie eine Bahre.",
            "Erhabene Bahre",
            "Erhöre nie eine Röhre.",
            "Erika feuert nur untreue Fakire.",
            "Erol, red nie in der Lore.",
            "Alles hat seine Zeit, nur die alten Weiber nicht.", //Kein Palindromsatz
            "Es eilt, immer ahnend Nebel, reger der Flegel Fred, reg' erlebend nen Harem mit Liese.",
        };
 
        return Palindrome;
 
    }
}

Für einen schnellen Verwendungszeck (weil man das auch so oft braucht oO)  habe ich das ganze als ExtensionMethod implementiert.

Wie schaut’s aus, hast du Verbesserungsvorschläge? Würdest du es anders machen, wenn ja wie? Du kannst im Kommentarfeld mit [code]var* deinCodeSnippet = 0;[/code] posten.


Viel Spaß beim entwickeln : )


* = Var oder nicht var…

Biggle ist kein Palindrom
Markiert in:        

Ein Gedanke über “Biggle ist kein Palindrom

  • März 20, 2011 bei 15:03
    Permalink

    Liest sich gut dein Blog. Sind einige Interessante Aspekte enthalten!

    Ich glaub einfacher wär dieser Palindromalgorithmus allerdings wenn du den bestehenden Satz nimmst, alles bis auf buchstaben rausfilterst, konkatenierst und dann einen Tauschalgorithmus schreibst der das Wort einmal in umgekehrter Reihenfolge erstellt und dann ein einfaches equals machst =)

Kommentare sind deaktiviert.