Как записать в массив символы которые присутствуют хотя бы в двух словах

В строке указано несколько слов, разделенных пробелами (по одно-му пробелу между словами). Какие символы присутствуют хотя бы вдвух словах? Предполагается, что все символы в строке имеют код, не больший, чем 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 шт):

Автор решения: MBo

Проще всего сделать два массива вроде 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
→ Ссылка