Java 两个字符串之间的子字符串差
给定两个长度为n的字符串,p=p1…pn和Q=q1…qn,我们将M(i,j,k)定义为pi…pi+k-1和qj..qj+k-1之间的不匹配数。也就是说,在集合表示法中,M(i,j,k)表示集合的大小Java 两个字符串之间的子字符串差,java,string,algorithm,Java,String,Algorithm,给定两个长度为n的字符串,p=p1…pn和Q=q1…qn,我们将M(i,j,k)定义为pi…pi+k-1和qj..qj+k-1之间的不匹配数。也就是说,在集合表示法中,M(i,j,k)表示集合的大小{0您可以制作一个布尔数组compare[n,n],其中compare[i,j]=(a[i]==b[j])。以后使用它,而不是重复进行比较。您的比较和寻址将非常少 public static int mismatch(String a, String b, int ii, int jj, int xx
{0您可以制作一个布尔数组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;
}
公共静态整数不匹配(字符串a、字符串b、整数ii、整数jj、整数xx){
int i,j=0;
对于(i=0;i
您的代码在站点上不需要5.1秒。一旦超过时间限制,他们就会停止运行您的代码。您的代码可能需要几分钟。因此,即使您使用此算法对其进行优化,您也会在详细信息部分再次获得5.1秒。因此,请使用您的算法,而不是优化!这看起来像是一个家庭作业或编程竞赛问题。我正在添加家庭作业标签。如果它不适用,请随意删除它。事实上,我解决了这个问题,但它需要更多的时间,只是我必须减少0.1秒的问题:)是的。这是一个面试问题,但它不足以减少时间。你测试了它吗?对不起,但对我来说,这听起来不可能。你还可以记住你所有的o最后的输出ant一次打印所有内容-这也应该节省时间。输入也是如此。您在哪里计算此比较[]?不在不匹配()中,我希望如此?我无法理解内部循环的优化如何不会对整个优化产生影响。这意味着,算法中存在优化错误。问题是,如果没有注释和合理的变量名称,代码实际上是不可读的。
4
3
8
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--;
}
}
}
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;
}