Путем «связанных» перестановок - вы фактически ищете все подстроки от длины 1 до полной длины строки. Это можно легко сделать с помощью двух циклов for. Дубликаты могут быть удалены с помощью метода Linq Distinct ().
public List<string> findAllOccurance(string str)
{
List<string> result = new List<string>();
for (int i = 1; i <= str.Length; i++)
{
for (int j=0; j <= str.Length-i; j++)
result.Add(str.Substring(j,i));
}
return result.Distinct().ToList();
}
ПРИМЕЧАНИЕ. Если вы действительно хотите вернуть пустую строку, вы можете либо изменить внешний цикл, чтобы он начинался с 0, либо просто добавить его вручную после создания экземпляра списка. Изменение цикла приведет к добавлению пустых строк str.Length и дополнительной работы для Distinct (), когда вы знаете, что всегда будете хотеть, чтобы возвращалась только 1 пустая строка.
List<string> result = new List<string>();
result.Add(String.Empty);
for (int i = 1; i <= str.Length; i++)
.....