Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个字符串之间的子字符串差_Java_String_Algorithm - Fatal编程技术网

Java 两个字符串之间的子字符串差

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

给定两个长度为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) {
    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;
}