#c_sharp #строки
Пример: есть первая строка с текстом "AByrjujABw qr", и есть вторая с текстом "AB". Соотвественно, вторая встретилась в первой 2 раза. Как такое посчитать на C#? Есть ли функция готовая, или свою выдумывать?
Ответы
Ответ 1
Дайте и мне: string a = "AByrjujABw qr"; string b = "AB"; int n = (a.Length - a.Replace(b, "").Length) / b.Length;Ответ 2
Вариант с IndexOf: string a = "AByrjujABw qr"; string b = "AB"; int c = 0, i = -1; while ((i = a.IndexOf(b, i + 1)) > -1) ++c; Console.WriteLine(c); Если вы хотите исключать пересечения вхождений (ABA в ABABA находить один раз, а не два), то можно переписать так: int c = 0, i = -b.Length; while ((i = a.IndexOf(b, i + b.Length)) > -1) ++c;Ответ 3
Задачу можно решить с помощью алгоритма Кнута-Морриса-Пратта Пусть у нас есть искомая подстрока substring, исходная строка str, и символ-разделитель, такой что он не входит ни в substring, ни в str. Тогда мы можем составить строку вида: substring + разделитель + str и пройтись по ней префикс-функцией: Привожу код на Java, думаю что вам не составит труда переписать его на C# public static void main(String args []) { String str = "AByrjujABw qr"; String substring = "AB"; String full = substring + "#" + str; int[] prefix = prefix(full.toCharArray()); System.out.println(Arrays.toString(prefix)); } private static int[] prefix(char[] s){ int n = s.length; int[] pi = new int[n]; for (int i = 1; i < n; ++i) { int j = pi[i-1]; while (j > 0 && s[i] != s[j]) j = pi[j-1]; if (s[i] == s[j]) ++j; pi[i] = j; } return pi; } После прохода префикс-функцией вам нужно пройтись по массиву prefix и посчитать количество чисел, равных длине вашей искомой подстроки, это и будет ответом. Результат выполнения префикс-функции: [0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0] длина искомой подстроки - 2, число 2 в префиксном массиве встречается 2 раза. Обратите внимание, что алгоритм даст результат при пересечении подстрок, например имея строки: str = "ABAxxABABAyy"; substring = "ABA"; результат будет равен 3, так как ABA встречается фактически 3 раза, 2 из которых пересекаются (подстрока ABABA)Ответ 4
Подготовка: var str = "AByrjujABw qr"; var separator = "AB"; Вариант 1 (используем Split()): var splitResult = str.Split(new [] {separator}, StringSplitOptions.None).Length-1; Вариант 2 (используем Regex): var regexResult = Regex.Matches(str, separator).Count;Ответ 5
string a = "AByrjujABw qr"; string b = "AB"; int c = 0, i = -1; while ((i = a.IndexOf(b, i + 1)) > -1) ++c;
Комментариев нет:
Отправить комментарий