разница подстроки между двумя строками - PullRequest
0 голосов
/ 20 февраля 2012

Учитывая две строки длины n, P = p1 ... pn и Q = q1 ... qn, мы определяем M (i, j, k) как число несовпадений между pi ... pi + k- 1 и qj..qj + k-1. То есть в обозначении набора, M (i, j, k) относится к размеру набора { 0<=x<k | pi+x not equal to qj+x| }.

Учитывая целое число K, ваша задача состоит в том, чтобы найти максимальную длину L такую, чтобы существовала пара индексов (i, j), для которых у нас есть M(i, j, L) <= K. Конечно, у нас также должны быть i+L-1 <=n и j+L-1 <=n. Ввод

Первая строка ввода содержит одно целое число T (1 <= T <= 10). Т-тесты следуют. Каждый тестовый пример состоит из целого числа K и двух строк P и Q, разделенных одним пробелом. Выход </p>

Для каждого тестового примера выведите одно целое число L, которое является максимальным значением, для которого существует пара индексов (i, j), такая, что M (i, j, L) <= K. </p>

Ограничения

0 <= K <= длина строки P Оба P & Q будут иметь одинаковую длину Размер каждой строки будет максимальным 1500 Все символы в P & Q являются строчными латинскими буквами. </p>

Пример ввода

3
2 tabriz torino
0 abacba abcaba
3 helloworld yellomarin

Пример вывода

4
3
8 

Пояснение: Первый тестовый случай: если мы берем «briz» из первой строки и «orin» из второй строки, то количество несовпадений между этими двумя подстроками равно 2, а длина этих подстрок равна 4. Это мы выбрали i = 3, j = 2, L = 4, и мы имеем M (3,2,4) = 2.

Второй тестовый случай: поскольку K = 0, мы должны найти самую длинную общую подстроку для заданных входных строк. В результате мы можем выбрать «aba», и у нас нет более длинной общей подстроки между двумя строками. Итак, ответ 3 для этого теста. То есть мы выбрали i = 1, j = 4 и L = 3, и мы имеем M (1,4,3) = 0.

Третий контрольный пример: мы можем выбрать «hellowor» из первой строки и «yellomar» из второй строки. Итак, мы выбрали i = 1, j = 1 и L = 8, и мы имеем M (1,1,8) = 3. Конечно, мы также можем выбрать i = 2, j = 2 и L = 8, и мы все еще имеем M (2,2,8) = 3.

вот моя реализация

import java.io.*;
import java.util.*;

class Solution {

    public static int mismatch(String a, String b, int ii, int jj, int xx) {
        int i, j = 0;
        for (i = 0; i < xx; i++) {
            if (a.charAt(ii) != b.charAt(jj)) {
                j++;
            }
            ii++;
            jj++;
        }
        return j;
    }

    public static boolean find(int x, String a, String b, int kx) {
        int nn = a.length();
        for (int i = 0; i <= (nn - x); i++) {
            for (int j = 0; j <= (nn - x); j++) {
                int k;
                k = mismatch(a, b, i, j, x);
                if (k == kx) {
                    return true;
                }
            }
        }
        return false;
    }

    public static void main(String args[]) throws IOException {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while (t > 0) {
            int k, n;
            String a, b;
            k = scanner.nextInt();
            a = scanner.next();
            b = scanner.next();
            n = a.length();
            int i = (n + k) / 2;
            int st = k, en = n
                while (i != k || i != n) {
                boolean ch = false, chh = false;
                ch = find(i, a, b, k);
                if (i != n) {
                    chh = find(i + 1, a, b, k);
                }
                if (i == n && ch == true) {
                    System.out.println(i);
                    break;
                }
                if (ch == true && chh == false) {
                    System.out.println(i);
                    break;
                }
                if (ch) {
                    st = i;
                    i = (i + en + 1) / 2;
                } else {
                    en = i;
                    i = (st + i) / 2;
                }
            }
            t--;
        }
    }
}

вышеприведенная реализация требует 5,1 секунды для ввода 0f длины строки 1500. Но максимальный лимит времени в java составляет 5 с. Если любой может улучшить этот код, пожалуйста, поделитесь своими соображениями

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Ваш код не занимает 5.1с на сайте. Они перестают запускать ваш код, как только он превышает ограничение по времени. Ваш код может занять несколько минут. Таким образом, даже если вы оптимизируете его с помощью этого алгоритма, вы снова получите 5.1s в разделе деталей. Так что работайте над своим алгоритмом, а не оптимизацией!

0 голосов
/ 20 февраля 2012

Вы можете создать логический массив compare[n,n], для которого compare[i,j]=(a[i]==b[j]). Позже используйте его вместо повторяющихся сравнений. У вас будет несравненно меньше сравнений и адресов.

public static int mismatch(String a, String b, int ii, int jj, int xx) {
    int i, j = 0;
    for (i = 0; i < xx; i++) {
        if (! compare[ii,jj]) {
            j++;
        }
        ii++;
        jj++;
    }
    return j;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...