[英]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 <=n
和j+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.