Как записать в массив символы которые присутствуют хотя бы в двух словах
В строке указано несколько слов, разделенных пробелами (по одно-му пробелу между словами). Какие символы присутствуют хотя бы вдвух словах? Предполагается, что все символы в строке имеют код, не больший, чем 127.(Сделать нужно максимально оптимизированно по быстродействию кода т.е без использования списков, split и т.д)
Вот мой вариант, решения до чего дошел(Сразу скажу он не верный):
fun main() {
var cnt = 0;
var s = readLine();
var items = Array(128){0};
var empty:Array<Char> = emptyArray();
if(s!=null)
{
for(c in s)
{
for(i in items.indices)
{
if(c.toInt() == i)
{
empty+=c;
cnt++;
}
cnt=0;
}
}
}
}
Я хотел пробегаться по введенной строке, сравнивая её с кодами аскии символов от 0 до 128, и в случае если два раза совпадет символ в слове, то записывать его в массив(но не совсем дошел до этого, т.к не понимаю как)
Может кто-нибудь знает, как можно реализовать данный алгоритм, максимально оптимизированный по быстродействию?
Ответы (1 шт):
Проще всего сделать два массива вроде items
В одном помечаем символы из слова единицами. Псевдокод
for(c in s) {
i = c.toInt();
if (i!=32) //не пробел
wordchars[i] = 1;
Когда встретили пробел - добавляем единицы из первого массива к соответствующим элементам второго, обнуляя их в первом.
else //пробел, переносим данные в общий массив
for (k=0;k<128;k++) {
if (wordchars[k] == 1) {
globalchars[k] += 1;
wordchars[k] = 0;
}
}
}
В результате в элементах globalchars будет содержаться количество слов, в которых участвует соответствующий символ.
Вот на Python:
s = 'hello world'
w = [0]*128
g = [0]*128
for c in s:
if ord(c) != 32:
w[ord(c)] = 1
else:
for k in range(128):
if w[k]:
g[k] += 1
w[k] = 0
#Для последнего слова, если пробела после него не было
for k in range(128):
if w[k]:
g[k] += 1
w[k] = 0
for k in range(128):
if g[k] > 1:
print(chr(k))
[Dbg]>>>
l
o