1. Using an array of characters, return all possible permutations of this array (without repetitions).
public static List<string> StringPermutations(char[] list) { List<string> result = new List<string>(); int x=list.Length-1; go(list,0,x, result); return result; } private static void go (char[] list, int k, int m, List<string> result) { int i; if (k == m) { result.Add(new string(list)); } else for (i = k; i <= m; i++) { swap (ref list[k],ref list[i]); go (list, k+1, m, result); swap (ref list[k],ref list[i]); } } private static void swap(ref char a, ref char b) { if (a == b) return; a ^= b; b ^= a; a ^= b; }
Sample usage
List<string> permutations = Helper.StringPermutations(new char[] {'D', 'N', 'A'});
Sample output
DNA
DAN
NDA
NAD
AND
ADN
2. Using an array of characters ("alphabet"), return all possible words generated from this alphabet of a specified length
public static IEnumerable<String> GetWordsWithRepetition(Int32 length, char[] alphabet) { if (length <= 0) yield break; for(int i = 0; i < alphabet.Length; i++) // (Char c = 'A'; c <= 'Z'; c++) { char c = alphabet[i]; if (length > 1) { foreach (String restWord in GetWordsWithRepetition(length - 1, alphabet)) yield return c + restWord; } else yield return "" + c; } }
3. Further can be used to get full "dictionary" with all possible words up to a specified length
public static string ALPHABET = "D N A"; public static List<string> Dictionary(int length) { char[] alphabet = Helper.AlphabetFromString(ALPHABET); List<string> final = new List<string>(); for (int i = 1; i <= length; i++) { List<string> result = Helper.GetWordsWithRepetition(i, alphabet).ToList(); final.AddRange(result); } return final; } public static char[] AlphabetFromString(string input) { string[] split = input.Split(' '); char[] alphabet = new char[split.Count()]; for (int i = 0; i < alphabet.Length; i++) { alphabet[i] = split[i][0]; } return alphabet; }
4. Further can be used to sort the words of the dictionary according to the alphabet provided using a comparer
public static int WordComparer(string one, string two) { char[] alphabet = AlphabetFromString(ALPHABET); int len = Math.Min(one.Length, two.Length); for (int i = 0; i < len; i++) { int posOne = Array.IndexOf(alphabet, one[i]); int posTwo = Array.IndexOf(alphabet, two[i]); if (posOne == posTwo) { continue; } else if(posTwo > posOne) { return -1; } return 1; } return two.Length > one.Length ? -1 : 1; }
Sample usage
List<string> final = Dictionary(3).Sort(WordComparer);
Sample output
Dby Evgeny. Also posted on my website
DD
DDD
DDN
DDA
DN
DND
DNN
DNA
DA
DAD
DAN
DAA
N
ND
NDD
NDN
NDA
NN
NND
NNN
NNA
NA
NAD
NAN
NAA
A
AD
ADD
ADN
ADA
AN
AND
ANN
ANA
AA
AAD
AAN
AAA
No comments:
Post a Comment