PTA: 文字列のパターン マッチング

トピック

この質問では、2 つの DNA 配列 A と B を読み取る必要があります。ここで、A はヒトの DNA 配列、B はウイルスの DNA 配列です。次に、ウイルス B が A に現れるかどうかを判断する必要があります (注: ウイルスの DNA 配列は環状です)。

入力フォーマット

整数 n を入力し、n 組の DNA シーケンスを入力します (各 DNA シーケンスは文字列であり、長さは 10000 を超えません)。

出力フォーマット

DNA 配列 A と B の各ペアについて、B が A に出現する場合は Yes を出力し、それ以外の場合は No を出力します。

入力サンプル

2
AAAAAAAAACCCCGGGGTTTTTTTAGTCCCTTGGGAAATCGAAGTCGTCAAAAAAAAA

GGGGTTTTTCCCCCCAAAATTTCCCGGGTTTTTTTTTTGGGGTTT

出力サンプル

はい
はい

アイデア

  1. IsVinDNA機能: ウイルスの DNA 配列がヒトの DNA 配列に現れるかどうかをチェックする機能。 2 つの文字列パラメーター a と b を受け入れます。ここで、a はヒト DNA 配列を表し、b はウイルス DNA 配列を表します。

まず、この関数は文字列 a と b の長さを取得し、その後の比較のために lena と lenb に格納します。

次に、ウイルスの DNA 配列の長さ b がヒトの DNA 配列の長さ a より大きいかどうかを確認し、大きい場合は直接 false を返します(ウイルスの DNA 配列はヒトの DNA 配列に含まれません)。

次に、文字列 cir (円、リング) を作成し、ヒト DNA 配列 a をそれ自体に接続します。実際には、環状の DNA 配列が構築されます。

最後に、find 関数を使用して、ウイルス DNA 配列 b が環状 DNA 配列 cir に現れるかどうかを調べます。

  1. 主に、DNA 配列の各ペアはループを通じて処理されます。各サイクルで、それぞれヒト DNA 配列とウイルス DNA 配列を表す 2 つの文字列 s1 と s2 が読み取られます。次に、 IsVinDNA 関数を呼び出して、ウイルス DNA 配列がヒト DNA 配列に出現するかどうかを確認します。最後に、チェック結果に応じて「Yes」または「No」が出力されます。

このコードの考え方は、人間の DNA 配列をそれ自体に接続し、 環状の DNA 配列を構築し、それからチェックすることです。ウイルス DNA 配列がこの環状配列内に存在するかどうか

予防:

文字列の find 関数を使用して、部分文字列が含まれているかどうかを確認します (strstr は C 言語で使用でき、効果は似ています)。

コード

#include<iostream>
#include<string>
using namespace std;

bool IsVinDNA(const string&a,const string&b)
{
    
    
    int lena = a.length();
    int lenb = b.length();
    if(lenb > lena)
        return false;
    string cir = a+a;
    if(cir.find(b) != string::npos)
        return true;
    return false;
}
int main()
{
    
    
    int n;
    cin>>n;
    string s1,s2;
    for(int i =0 ;i<n;i++)
    {
    
    
        cin>>s1>>s2;
        if(IsVinDNA(s1,s2))
        {
    
    
            cout<<"Yes"<<endl;
        }
        else
        {
    
    
            cout<<"No"<<endl;
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/m0_74195626/article/details/133849890