Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Solution: Permutations

package main

import (
	"fmt"
)

func main() {
	results := permutations("a")
	fmt.Println(results)
}

// We assume they are unique
func permutations(word string) []string {
	if word == "" {
		return []string{""}
	}
	perms := []string{}
	for i, rn := range word {
		rest := word[:i] + word[i+1:]
		//fmt.Println(rest)
		for _, result := range permutations(rest) {
			perms = append(perms, fmt.Sprintf("%c", rn)+result)
		}
		//perms = append(perms, fmt.Sprintf("%c\n", rn))
	}
	return perms
}
package main

import (
	"fmt"
	"sort"
	"testing"
)

func TestPermutations(t *testing.T) {
	cases := make(map[string][]string)
	cases["a"] = []string{"a"}
	cases["ab"] = []string{"ab", "ba"}
	cases["abc"] = []string{"abc", "acb", "bac", "bca", "cab", "cba"}
	cases["abcd"] = []string{
		"dabc", "dacb", "dbac", "dbca", "dcab", "dcba",
		"adbc", "adcb", "bdac", "bdca", "cdab", "cdba",
		"abdc", "acdb", "badc", "bcda", "cadb", "cbda",
		"abcd", "acbd", "bacd", "bcad", "cabd", "cbad"}

	for inp, expected := range cases {
		actual := permutations(inp)
		if !compare(expected, actual) {
			t.Error(fmt.Sprintf("Expected '%v', Actual '%v'", expected, actual))
		}
	}
}

func compare(a, b []string) bool {
	//fmt.Println(a)
	//fmt.Println(b)
	if len(a) != len(b) {
		return false
	}
	sort.Strings(a)
	sort.Strings(b)

	for i := 0; i < len(a); i++ {
		if a[i] != b[i] {
			return false
		}
	}
	return true
}