[C#] Домашно Strings and Text Processing - 4 задача


16

Условие: Write a program that finds how many times a substring is contained in a given text (perform case insensitive search).

Example: The target substring is "in". The text is as follows:

We are living in an yellow submarine. We don't have anything else. Inside the submarine is very tight. So we are drinking all the day. We will move out of it in 5 days.

The result is: 9.

Решениеsource.

Обяснение: Използваме Matches.Count, с флаг IgnoreCase.




Отговори



2
Чудесно решение! Кратко точно и ясно! Само човек трябва да е запознат малко повече с: този клас: System.Text.RegularExpressions; ;)

от paci1234 (15 точки)


8

Решение:

http://pastebin.com/aaRR4nAn

Обяснение:

1. Пускам един for цикъл до string.Length-1

2. Проверявам колко пъти ще срещна "in" в целия стринг. Като започвам от 0-вия субстринг с дължина 2, 1-вия субстринг с дължина 2 и т.н., дали не е равен на "in", като парчето от две букви което съм взел, без значение дали са малки или главни да ги направи малки с метода .ToLower() така си гарантирам че ще бъде преброено и това парче.

if (str.Substring(i, 2).ToLower() == "in")


от Assi.NET (3050 точки)


0
цикъла може да стане:
if (str.Substring(i, 2).ToLower() == "in") { count++; i++; }
тъй като когато откриеш съвпадение (т.е. си на 'i'), със сигурност знаеш че следващата е 'n' и може да я прескочиш.


0
Съгласен съм, вече го оптимизирах :)

от Assi.NET (3050 точки)



1

Ето го моето решение Link.

-int subSum = text.IndexOf(subStr);  - намирам индекса на първото срещане на търсения substring

-чрез for цикъл и subSum = text.IndexOf(subStr,subSum+1); увеличавам индекса от който да търси докато не намери повече търсения substring  -тогава subStr = -1

-При subStr = -1 прекъсва if-а,  който чрез променлива count отчита броя пъти subStr>=0 т.е. броя на срещане на substringa.

-StringComparison.OrdinalIgnoreCase за case insensitivity


от mitkokrik (87 точки)


2

Решение:

http://pastebin.com/E4b7Cnx7

Обяснение:

Ето едно малко по-балъшко решение с IndexOf. Какво правя ?

1. Използваме while цъкъл който върти докато IndexOf не ми върне -1 ( тоест няма повече подстрингове "in" в масива.

2. Всяко тъесене с IndexOf става от индекса на предишния  намерен елемент + 1


от Teodor92 (13062 точки)


0
И аз нещо подобно бях направил, но в условието се иска да е "insensitive search".

от Nedko (1220 точки)

0
Нямаш нужда от nostring променливата - заменяш if-а с while и спестяваш 5-6 реда код + една алокация ;) Също така, като увеличаваш startIndex, безсмислено е два пъти да търсиш IndexOf - можеш в while-клаузата да му присвоиш стойността на намерения индекс: while ((startIndex = input.IndexOf(searchSub, startIndex)) != -1) и в тялото само трябва да увеличиш startIndex с 1 или, още по-добре, с дължината на searchSub.

от gugulete (110 точки)



1

Понеже трябва да е case insensitive, ползвам речник:


от AlexPopov (1568 точки)


0

1. След като се въведат входните данни - това, в което ще търсим и това, което търсим ги копирам на отделни променливи за да им запазя първоначалния вид и да ги отпечатам след това в крайния резултат.

2. Правя двата входа ToLower.

3. Започвам търсене от първия символ с IndexOf(string, index), където string-а ми е това, което търся, а index от коя позиция нататък го търся .
Първоначално index-a е 0, а след всяко успешно търсене се увеличава с дължината на търсеното + намерения индекс. 
Всичко това съм го сложил в един while цикъл, който приключва работа при index = -1, т.е. при ненамиране на повече от търсените стрингове.

4.След всяко успешно търсене увеличавам брояча с 1;

5. Отпечатвам изхода с запазените входни данни и резулата от преброяването.

Решение




1

Решение: http://pastebin.com/jKdcjgfU

Пояснения:

1. текста го text.ToLower();  за да избегнем ако има големи букви.

2. Започвам да търся последния индекс на substring от края към началото. text.LastIndexOf(subtr);

3. Увеличвам count++

4. Изтривам от тази позиция до края

5. Връщам като отговор count

 

Може да работи за всеки субстринг!

 


от deyan.keray (266 точки)


0

Намирам теста с IndexOf, овеличавам брояча и изтривам текущо намереният текст.

решение




1

И моето домашно е подобно, но jasssonpet така нее ли по-добре:

int b = (Regex.Matches(str, substr, RegexOptions.IgnoreCase).Count);

Console.WriteLine("The Number Of Substrings In The Text Is: {0}", b);


от Martin88 (209 точки)


0
Прав си, по-добре е така по принцип, даже може още да се разбие за да стане по-ясно.

от jasssonpet (6814 точки)

0
Определено Regex е истината... само разгледах няколко решения с indexOf... ми не е елегантно.. не е много ясно.




0

Решение с оптимизиран цикъл, който върти до последния индекс на срещане на търсения substring и се увеличава с големината на търсения стринг.

http://pastebin.com/u76SrgmS


от sylviapsh (302 точки)


0
sylviapsh ако мислиш, че с коментари на всеки ред е по-четливо... направо се ужасих.. не се вижда къде е кодът :) Хубаво е да има.. но само на много завъртяни места.. които не можеш/не искаш да разбиеш


0
Все още на мен така ми е по-лесно да си следя и осмисля нещата - просто тия кодове ги пиша докато 2 деца се катерят по мен и ми пищят за каквото се сетиш всяка секунда и то денонощно. Общо взето пиша ред, правя 10 други неща и пак се връщам на кода. Знам, че са много, но не е трудно да се махнат. Предполагам, че тези, които знаят какво правят им пречат и са им в повече, на други това им помага. Нали знаеш, че угодия няма ;)

от sylviapsh (302 точки)