Я думаю, ваш профессор ищет API, который принимает только один символ, а не массив.Не массив символов.Под этим я подразумеваю, что если в качестве разделительной строки указано «abcd», вы не будете разбивать на все экземпляры «a», «b», «c», «d».Вы разделитесь, только если найдете всю строку.
Ваш текущий алгоритм не O (n), потому что для каждого элемента входного массива вы сравниваете его с каждым элементом массива-разделителя.Это приводит к времени выполнения O (n * m).
Я не думаю, что можно преобразовать это значение в O (n), потому что каждый элемент на входе должен сравниваться с каждым элементоммассив разделителей.Я думаю, что, скорее всего, ваш профессор задает другой вопрос относительно массива разделителей.
public static String[] Split(String input, String delimiter)
{
List<String> parts = new List<String>();
StringBuilder buff = new StringBuilder();
if (delimiter.Length > 1) //you are splitting on a string not a character
{
//perform string searching algorithm here
}
else if(delimiter.Length == 0)
{
throw new InvalidOperationException("Invalid delimiter.");
}
else //you are splitting on a character
{
char delimChar = delimiter[0];
for (int i = 0; i < input.Length; i++)
{
if (input[i] == delimChar)
{
parts.Add(buff.ToString());
buff.Clear();
}
else
{
buff.Append(input[i]);
}
}
}
return parts.ToArray();
}
C # String.Split()
действительно принимает массив разделителей, но я не верю, что это делаетрасщепление по времени O (n).
Если вы ищете алгоритмы поиска строк, они могут оказаться полезными.http://en.wikipedia.org/wiki/String_searching_algorithm
edit: я неправильно сослался на тот факт, что API C # String.Split()
не принимает массив разделителей.