Почему зацикливается программа на C++?

Дана строка S. Вывести символ L, который встречается наибольшее число раз. И количество этих символов (N). Если есть несколько символов с одинаковым количеством, вывести ПЕРВЫЙ из них.

int max1=0, count=1, m, maxs;
    string L, max2, S;
    int i;
    getline(cin,S);
    for ( i = 0; i < S.size(); i++) {
        max2 = S[i];
        m = i;
        while ((maxs = (S.find(max2, i+1)) != -1) && ((i+1)<S.size())) {
            count++;
            i=maxs;
        }
        if (count > max1) {
            L = max2;
            max1 = count;
        } 
        i = m;
        count = 1;
    } 
    
    cout << L << max1;
}

Ответы (1 шт):

Автор решения: Zhihar
    while ((maxs = (S.find(max2, i+1)) != -1) && ((i+1)<S.size())) {
        count++;
        i=maxs;
    }

вот этот кусок

(maxs = (S.find(max2, i+1)) != -1)

означает следующее:

  1. найти строку max2 в строке S

  2. сравнить позицию c -1

  3. присвоить maxs результат сравнения (т.е. 0 если false или 1 если true)

значит если в строке присутствует подстрока дальше 1 символа, вы постоянно будете находить эту подстроку (поиск начинается с 1 символа), получать maxs = 1

... и искать и постоянного находить эту подстроку никуда по строке не сдвигаясь

подозреваю, что правильный код должен был бы быть таким:

while (
          ((maxs = S.find(max2, i+1)) != -1) && 
          (i + 1 < S.size()
      )
→ Ссылка