0

タイトルが示すように、私は特定のテキスト (この場合はモビー ディック) をキーワードとして検索するプロジェクトに取り組んでいます。ただし、単語が線形である代わりに、スキップ距離を介して検索しようとしています (cat の代わりに、c---a---t を探します)。

私は複数の方法を試しましたが、実際に1つのスキップ距離を終了し、機能せず、次の許可された距離を呼び出すことができないようです(事前設定された制限に達するまで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

あなたが投稿した方法についてはわかりませんが、代わりにこれを使用できます。これには文字列と文字配列を使用しました:

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

char 配列 'check' で照合するパターンをフィードします。

文字列「adecrayt」は true と評価されます。文字列「cat」は false と評価されます。

お役に立てれば。

【この部分はスキップ距離を固定するためのものでした】

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

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 に答える
0

を渡す場合はString、次の 1 行だけが必要です。

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 に答える