0

私の質問は部分文字列関連です。

開始文字列と 3 つの終了文字列のうちの 1 つとの間の可能な限り長い部分文字列をどのように見つけますか? また、最大の部分文字列が始まる元の文字列のインデックスを見つける必要もあります。

そう:

開始文字列: "ATG"

3 つの可能な終了文字列: 「TAG」「TAA」「TGA」

元の文字列の例: "SDAFKJDAFKATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAGSDFSDATGFF" したがって、その結果は次のようになります: - 最長部分文字列の長さ: 23 (部分文字列 ATGDFSDFAKJDNKSJFNSDTGA から) - 最長部分文字列のインデックス: 10

正規表現を使用できません。

助けてくれてありがとう!

4

4 に答える 4

0

これは間違いなく最も簡単な方法で、たった 1 行です。

String target = str.replaceAll(".*ATG(.*)(TAG|TAA|TGA).*", "$1");

インデックスを見つけるには:

int index = str.indexOf("ATG") + 3;

注:「正規表現を使用できません」という発言は、「正規表現が苦手です」という意味に解釈しました。Javaの質問であれば、正規表現が利用できるからです。

于 2013-11-10T08:14:03.013 に答える
0

あなたの問題に対する美しくエレガントな解決策がすでにいくつかあります(ボヘミアンで好奇心旺盛です)。それでも、最初に述べたように、正規表現を使用できない場合は、代替手段があります。このコードは特に洗練されたものではありません。指摘されているように、それを行うためのより良い方法がありますが、問題の解決策の背後にあるロジックを少なくとも明確に示す必要があります。

開始文字列と 3 つの終了文字列のうちの 1 つとの間の可能な限り長い部分文字列をどのように見つけますか?

最初に、開始文字列のインデックスを見つけ、次に各終了文字列のインデックスを見つけ、各終了の部分文字列を取得してから、それらの長さを取得します。string が見つからない場合、そのインデックスは -1 になることに注意してください。

    String originalString = "SDAFKJDAFKATGDFSDFAKJDNKSJFNSDTGASDFKJSDNKFJSNDJFATGDSDFKJNSDFTAGSDFSDATGFF";

    String STARTING_STRING = "ATG";

    String END1 = "TAG";
    String END2 = "TAA";
    String END3 = "TGA";

    //let's find the index of STARTING_STRING
    int posOfStartingString = originalString.indexOf(STARTING_STRING);

    //if found
    if (posOfStartingString != -1) {
        int tagPos[] = new int[3];

        //let's find the index of each ending strings in the original string
        tagPos[0] = originalString.indexOf(END1, posOfStartingString+3);
        tagPos[1] = originalString.indexOf(END2, posOfStartingString+3);
        tagPos[2] = originalString.indexOf(END3, posOfStartingString+3);

        int lengths[] = new int[3];

        //we can now use the following methods:
        //public String substring(int beginIndex, int endIndex)
        //where beginIndex is our posOfStartingString
        //and endIndex is position of each ending string (if found)
        //
        //and finally, String.length() to get the length of each substring

        if (tagPos[0] != -1) {
            lengths[0] = originalString.substring(posOfStartingString, tagPos[0]).length();
        }
        if (tagPos[1] != -1) {
            lengths[1] = originalString.substring(posOfStartingString, tagPos[1]).length();
        }
        if (tagPos[2] != -1) {
            lengths[2] = originalString.substring(posOfStartingString, tagPos[2]).length();
        }

    } else {
        //no starting string in original string
    }    

lengths[] テーブルには、STARTING_STRING と 3 つのそれぞれの末尾で始まる文字列の長さが含まれるようになりました。次に、どれが最も長いかを見つけるだけで、答えが得られます。

また、最大の部分文字列が始まる元の文字列のインデックスを見つける必要があります。

これは、開始文字列の開始位置のインデックスになります。この場合は 10 です。

于 2013-11-10T21:52:42.803 に答える
0

文字列を次の正規表現に一致させます。

ATG[A-Z]+(TAG|TAA|TGA)

複数の一致が発生した場合は、反復して最も長いものを保持します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

    // using pattern with flags
    Pattern pattern = Pattern.compile("ATG[A-Z]+(TAG|TAA|TGA)");

    Matcher matcher = pattern.matcher( yourInputStringHere );

    while (matcher.find()) {
        System.out.println("Found the text \"" + matcher.group()
                + "\" starting at " + matcher.start()
                + " and ending at index " + matcher.end());
    }
于 2013-11-10T08:09:49.627 に答える