Входной сигнал: ул = «abcdeefuiuiwiwwaaaa» п = 3 выход: «iwiwwaaaa» (длинный зиЬзЬг с 3 дифф символов)Найти самую длинную подстроку N уникальных символов
У меня есть решение, как показано ниже. Мои вопросы:
- Какова временная сложность? Я знаю, что он должен быть лучше, чем O (n^2), но не уверен, может ли он заключить, что это O (n).
Решение ниже не может охватывать весь ASCII, можем ли мы улучшить это без дополнительного пространства?
public static String getSubstrOfMChars(String str, int m) { if (str==null || str.length()==0) return ""; int len = str.length(); String max = ""; for(int i=0; i<len;) { StringBuilder sb = new StringBuilder(); int counter = 1; int checker = 0; char firstChar = str.charAt(i); int firstCharPos = i; // first char position in the string sb.append(firstChar); checker |= 1 << (firstChar - 'a'); for(int j=i+1; j<len; j++) { char currChar = str.charAt(j); if (currChar == firstChar) firstCharPos++; int tester = checker & (1<<(currChar - 'a')); if (tester > 0) // already have such character { sb.append(currChar); continue; } // new character if (++counter > m) { i = firstCharPos + 1; if (sb.length() > max.length()) { max = sb.toString(); } break; } sb.append(currChar); checker |= 1 << (currChar - 'a'); } if (counter <= m) { if ((counter==m) && sb.length() > max.length()) { max = sb.toString(); } break; } } return max; }
Ваш алгоритм может содержать максимум 32 значения для проверки, поскольку вы используете 'ints'. И я бы дважды проверял утверждение: «Я знаю, что он должен быть лучше, чем O (n^2) ...». Чтобы помочь, проверьте суммирование '1 + 2 + 3 ... + N'. –
Подсказка: подумайте о том, как изменяется значение j при переходе по первому циклу. – smcg