Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Really Simple Anagram Solver

0.00/5 (No votes)
9 Sep 2011 1  
One really simple anagram solver using recursion.

Introduction

I will be back! This is my first post since 5 years ago! If you have been interviewed by Microsoft before, you might have come across this kind of recursive questions. I have written a few different solutions, and this is so far my latest, and maybe the smallest one.

Background

Always good to get your mind juggled a little bit. If you are in the middle of a Tech Access for a job, hope it can help and good luck!

Using the Code

If you have VS2010, you will know how to run this project. Here is the recursive method:

static void GenerateAnagram(IList<string> result, string prefix, string src)
{
    if (src.Length == 0)
    {
        result.Add(prefix);
        return;
    }

    for (int i = 0; i < src.Length; i++ )
    {
        string tempPrefix = src[i].ToString();
        string newSrc = src.Substring(0, i) + src.Substring(i + 1);
        var temp = new List<string>();
        GenerateAnagram(temp, tempPrefix, newSrc);
        foreach (var s in temp)
        {
            result.Add(prefix + s);
        }
    }
}

And here is how to call it:

var result = new List<string>();
GenerateAnagram(result, "", "ABC");

And after one of my reader pointed out the memory problem, here is another approach using recursion:

static IEnumerable<string> GenerateAnagramAlt(string src)
{
    if (src.Length == 0) yield break;
    if (src.Length == 1) yield return src;

    foreach (string rest in GenerateAnagramAlt(src.Substring(1)))
    {
        for (int i = 0; i < src.Length; i++)
        {
            string temp = rest.Substring(0, i) + src[0] + rest.Substring(i);
            yield return temp;
        }
    }
}

I prefer this one as it doesn't have the memory limitation and nearly twice faster when n >= 9 characters. I like its IEnumberable syntax as well! I have updated a new project to include the source file. Thanks goes to my friend ajasin1, who came up with this.

Points of Interest

I have not included logic to filter duplicated cases, as it can be done using LINQ quite easily.

History

  • 08-09-2011: First posted.
  • 09-09-2011: 2.0 posted for GenerateAnagramAlt.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here