using System.Collections;
using System.Collections.Generic;
public static void Main() {
string val = "foobarfoobar";
Console.WriteLine(string.Join(" ", FindSubstring(val, new [] {
static IList < int > FindSubstring(string s, string[] words) {
var list = new List < IList < string >> ();
DoPermutation(words, 0, words.Length - 1, list);
return TrackIndexes(s, list);
static IList < IList < string >> DoPermutation(string[] str, int start, int end, IList < IList < string >> list) {
list.Add(new List < string > (str));
for (var i = start; i <= end; i++) {
Swap(ref str[start], ref str[i]);
DoPermutation(str, start + 1, end, list);
Swap(ref str[start], ref str[i]);
static void Swap(ref string a, ref string b) {
static List < int > TrackIndexes(string pattern, IList < IList < string >> aLst) {
List < int > indexes = new List < int > ();
foreach(var item in aLst) {
strings = new List < string > {
foreach(var list in item) {
if (str.Length == strings[0].Length && pattern.Contains(str)) {
indexes.AddRange(AllIndexesOf(pattern, str));
return indexes.Distinct().ToList();
public static int[] AllIndexesOf(string str, string substr, bool ignoreCase = false)
if (string.IsNullOrWhiteSpace(str) || string.IsNullOrWhiteSpace(substr))
throw new ArgumentException("String or substring is not specified.");
var indexes = new List<int>();
while ((index = str.IndexOf(substr, index, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal)) != -1)
return indexes.ToArray();