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