0

正如标题所说,我正在做一个项目,在这个项目中我正在搜索给定的文本,在这种情况下是 moby dick,以查找关键字。然而,我们试图通过跳跃距离(而不是 cat,寻找 c---a---t)找到它,而不是线性的单词。

我尝试了多种方法,但似乎无法让它真正完成一个跳跃距离,让它不起作用,并调用下一个允许的距离(递增 1 直到达到预设限制)

以下是完成此搜索的当前方法,也许这只是我缺少的一些愚蠢的东西?

private int[] search()
throws IOException
{
        /*
         tlength is the text file length, 
         plength is the length of the
         pattern word (cat in the original post),
         text[] is a character array of the text file. 
         */

    int i=0, j;
        int match[] = new int[2];
        int skipDist = 2;
        while(skipDist <= 100)
        {
            while(i<=tlength-(plength * skipDist))
            {
                j=plength-1;

                while(j>=0 && pattern[j]==text[i+(j * skipDist)])j--;

                if (j<0)
                   {
                      match[0] = skipDist;
                      match[1] = i;
                      return match;
                   }


                else
                   {
                     i++;

                   }



            }
            skipDist = skipDist + 1;

        }
        System.out.println("There was no match!");
        System.exit(0);
        return match;
    }
4

2 回答 2

0

如果传入 a String,则只需要一行:

public static String search(String s, int skipDist) {
    return s.replaceAll(".*(c.{2," + skipDist + "}a.{2," + skipDist + "}t)?.*", "$1");
}

如果未找到匹配项,将返回空白。

于 2013-09-10T09:07:34.343 回答
0

我不知道您发布的方法,但您可以改用它。我为此使用了字符串和字符数组:

    public boolean checkString (String s)
{
    char[] check = {'c','a','t'};
    int skipDistance = 2;

    for(int i = 0; i< (s.length() - (skipDistance*(check.length-1))); i++)
    {
        boolean checkValid = true;
        for(int j = 0; j<check.length; j++)
        {
            if(!(s.charAt(i + (j*skipDistance))==check[j]))
            {
                checkValid = false;
            }
        }

        if(checkValid)
            return true;
    }

    return false;
}

在字符数组“检查”中输入要匹配的模式。

字符串“adecrayt”评估为真。字符串“cat”评估为假。

希望这可以帮助。

[这部分是固定跳跃距离]

+++++++++++++++++++++++++++++++

现在对于 2 到 100 之间的任何跳跃距离:

    public boolean checkString (String s)
{
    char[] check = {'c','a','t'};
    int index = 0;
    int[] arr = new int[check.length];

    for(int i = 0; i< (s.length()); i++)
    {
        if(check[index]==s.charAt(i))
        {
            arr[index++] = i;
        }
    }
    boolean flag = true;

    if(index==(check.length))
    {
        for(int i = 0; i<arr.length-1; i++)
        {
            int skip = arr[i+1]-arr[i];
            if(!((skip>2)&&(skip<100)))
            {
                flag = false;
            }
            else
            {
                System.out.println("Skip Distance : "+skip);
            }
        }
    }
    else
    {
        flag = false;
    }

    return flag;
}
于 2013-09-10T06:21:35.957 回答