Я только что попытался выполнить задачу программирования, которую я не смог успешно завершить. Спецификация должна читать 2 строки ввода от System.in
.Поиск индекса перестановки в строке
- Список 1-100 разделенных пробелами слов, имеющих одну и ту же длину и от 1 до 10 символов.
- Строка длиной до миллиона символов, которая содержит перестановку вышеприведенного списка только один раз. Возвращает индекс, где эта перестановка начинается в строке.
Например, мы можем иметь:
dog cat rat
abcratdogcattgh
3
Где 3
результат (как напечатано System.out
).
Это легально иметь дублированный слово в списке:
dog cat rat cat
abccatratdogzzzzdogcatratcat
16
Код, который я продюсировал работал при условии, что слова о том, что ответ начинается с не произошло ранее. Во 2-ом примере здесь, мой код будет не потому, что dog
уже появился перед где ответ начинается с индексом 16.
Моя теория была:
- Найти индекс, где каждое слово встречается в строке
- Extract этой подстроки (как у нас есть ряд известных слов с известной длиной, это возможно)
- Убедитесь, что все слова встречаются в подстроках
- Если они, возвращают индекс, который происходит эта подстрока в исходной строке
Вот мой код (он должен быть скомпилирован):
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
String[] l = line.split(" ");
String s = br.readLine();
int wl = l[0].length();
int len = wl * l.length;
int sl = s.length();
for (String word : l) {
int i = s.indexOf(word);
int z = i;
//while (i != -1) {
int y = i + len;
if (y <= sl) {
String sub = s.substring(i, y);
if (containsAllWords(l, sub)) {
System.out.println(s.indexOf(sub));
System.exit(0);
}
}
//z+= wl;
//i = s.indexOf(word, z);
//}
}
System.out.println("-1");
}
private static boolean containsAllWords(String[] l, String s) {
String s2 = s;
for (String word : l) {
s2 = s2.replaceFirst(word, "");
}
if (s2.equals(""))
return true;
return false;
}
}
Я могу решить мою проблему и сделать его пройти 2-й примера, убрав комментирование петли while
. Однако это имеет серьезные последствия для производительности. Когда у нас есть ввод из 100 слов по 10 символов каждый и строка из 1000000 символов, время, затраченное на завершение, просто ужасно.
Учитывая, что каждый случай в испытательном стенде имеет максимальное время выполнения, добавление цикла while приведет к сбою теста на основании того, что он не завершил выполнение вовремя.
Что было бы лучшим способом подойти и решить эту проблему? Я чувствую себя побежденным.
Поскольку любая перестановка будет выполнена, это не поможет. – t0mppa