簡體   English   中英

兩個字符串之間的子字符串差異

[英]substring difference between two strings

給定兩個長度為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| } { 0<=x<k | pi+x not equal to qj+x| } { 0<=x<k | pi+x not equal to qj+x| }

給定一個整數K,您的任務是找到最大長度L,以使存在一對索引(i,j),我們有M(i, j, L) <= K 當然,我們也應該讓i+L-1 <=nj+L-1 <=n 輸入項

輸入的第一行包含一個整數T(1 <= T <= 10)。 隨后是T測試用例。 每個測試用例由一個整數K和兩個用單個空格分隔的字符串P和Q組成。 輸出量

對於每個測試用例,輸出單個整數L,該整數是存在一對索引(i,j)的最大值,使得M(i,j,L)<= K。

約束條件

0 <= K <=字符串P的長度P和Q的長度相同。每個字符串的大小最大為1500。P&Q中的所有字符均為小寫英文字母。

樣本輸入

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--;
        }
    }
}

上面的實現輸入0f 1500字符串長度需要5.1秒。但是java中的最大時間限制是5sec。如果任何人可以改進此代碼,請分享您的看法

您的代碼在網站上不需要5.1秒。 一旦超過時間限制,它們就會停止運行您的代碼。 您的代碼可能要花幾分鍾。 因此,即使您使用此算法對其進行優化,您也將在詳細信息部分再次獲得5.1s。 因此,根據您的算法進行工作,而不是優化!

您可以創建一個布爾數組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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM