Chapter 5——データ構造——文字列

7114 ワード

1.タイトルリスト
poj 1035、poj 3080、poj 1936
2.POJ 1035——Spell checker
2.1テーマの説明
Description:You,as a member of a development team for a new spell checting program,arto write a module that will check the corectnes of given words using a known dict workerry of alcorectworld therictworld therictins.Irectionit.that can be obatained by one of the follwing operations:?deleting of one letter from the word;replecng of one letter in the word with an arbitrary letter;insetitititing of one arbitrryletter into the wod.Your tass s s to write the program that will find all possible replaccements from the dictctorarary forevevevrygivewod.Input:The first part partof the ininput the input the input ficonconconcontititititititititititititis the the the the inininininininininininininininininininininininininininininininininininininininininininininininininininininininin' on a separate line.All wonds ararare different.The e e e will be at most 10000 wods in the dictary.The nexpat pat pat pat of the file contains all wowowoworss s s s s worsrsrsrsaattttttttttttttttttttttttttwichcheced.Eachワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードワードオンライン.Ths.Thisisisisiss.Thisisisisisisis.Thisisisisisispaisisisisisはい、「wonds from the dictorary and wonds to be checked」consist only of smaalalalalalphaaabeeticcharacters and each one contains 15 characters at most.Outputt:Write to the output file exactly one line e e e e e forforeveveveveeeerychcheeeeeeeeeeeeeededededererererererererererererererererestststststststststststststthethethethethethethethetherererererererererererererererererererererererererererereアクション.If the word iscorectthen write thisword first,then write thisword first,then write the the character'(colon)、and after a single sprite alits possiblblble replacments,then parated thethethetherererererererepated thethethetheaparacts s thethethethethethethethethethethethethethethethethererererererererererererererererererererererererereparts s s s s thethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethethetheof the input file).If there areのreplaccemens for this word then the line feed Shuld immediately followe the colon.
Sample Input:
i
is
has
have
be
my
more
contest
me
too
if
award
#
me
aware
m
contest
hav
oo
or
i
fi
mre
#

Sample Output:
me is correct
aware: award
m: i my me
contest is correct
hav: has have
oo: too
or:
i is correct
fi: i
mre: more me
2.2解決の考え方
この問題は文字列のパターンマッチングの問題です.文字を削除、変更、挿入することしかできないので、復元できるかどうかを判断します.2つの文字列の長さを基準に議論します.
  • は、2つの文字列の長さが同じである場合、2つの文字列の対応するビットの異なる文字の数を統計し、1より大きいと元に戻すことができません.
  • は、2つの文字列の長さが1つ足りない場合、長さが小さい文字列がモードマッチング可能かどうかを判断し、長さが大きい文字列が可能であれば、元に戻すことができる.モードマッチング:つまり、1つの列が別の列のサブストリングであるかを判断する(ここでのサブストリングは連続を要求しない)
  • .
  • 、2つの文字列の長さが1より大きい場合、元に戻すことはできません.
  • 次に簡単にstringとmapでよく使われる操作関数をまとめます.(1).string:
  • erase(iter):単一の要素を削除し、iterは削除が必要な要素のシーズマリー
  • である.
  • insert(pos,string):pos位置に文字列string
  • を挿入する.
  • insert(iter,string):iterディケンサ位置にstringを挿入する(注意:insert操作で、挿入できる位置にはstring.length()があります.
  • find(string):パラメータstringが元の文字列のサブストリングである場合、stringがその中に出現する最初の位置を返します.
  • substr(pos,len):posビットから、長さlenの文字列(2)を返します.map
  • mapのディケンサ:map:iterator it;
  • mapの要素挿入:map[T 1]=T 2
  • map検索キー:map.find(T)
  • map要素のアクセス:下付きアクセスまたはローズマリーアクセス、注意maoのディケンサはfirstとsecondメンバーを含む構造体である.
    2.3コード
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    vector dict;
    
    bool repla(string s1, string s2){
        //         
        int len1 = s1.length();
        int len2 = s2.length();
        int num = 0;
        if (len1 == len2){ //      
            for (int i = 0; i < len1; i++)
                if (s1[i] != s2[i])
                    num++;
            if (num == 1) return true;
        }else if(len1 - len2 == 1){ //     1 
            //            
            for (int i = 0; i < len1; i++){
                if (s1[i] == s2[num])
                    num++;
                if (num == len2) return true;
            } 
        }else if (len2 - len1 == 1){
            //             
            for (int i = 0; i < len2; i++){
                if (s1[num] == s2[i])
                    num++;
                if (num == len1) return true;
            } 
        }
        return false;
    }
    
    int main(){
        string s;
        int k = 0;
        while (cin>>s && s != "#"){
            dict.push_back(s); //map      
        }
        while (cin>>s && s != "#"){
            bool flag = false;
            for (int i = 0; i < dict.size(); i++){
                //        temp           
                if (s == dict[i]){
                    cout<
    4.POJ 1936——All in All
    4.1問題の説明
    Description
    You have devised a new encryypttechnique which encodes a message by inserting between its characters Ladomlygeneneneneininininininininininins.Because of pending patetestissususues well will not distststststininininininininininininininininininininininininininininininininininininininininininininststststststststststststinininininininininininininininininininininininininininininininininininininininininininincessary to write a programthat checks if the message is really encoded in the final string.
    Gven two stings and t,you have to decide whether s s s s s a subsequence of t,i.e.if you can remove characters from t such that the concatent of the remaning characters.Input
    The input contains several testcases.Each is specified by two stings,t of alphanumeric ASCII characters separated byホワイトパス.The length of s and t will more than 100000.Output
    For each test case output“Yes”,if s is a subsequence of t,otherswise out put“No”.
    Sample Input
    
    sequence subsequence
    person compression
    VERDI vivaVittorioEmanueleReDiItalia
    caseDoesMatter CaseDoesMatter
    
    Sample Output
    
    Yes
    No
    Yes
    No
    
    2.2問題解決
    LCS思想を使用して、d配列ストレージを使用する必要はありません.記憶空間が10000*10000に達するため、スクロール配列を使って最適化することもできます.ここでは議論しません.
    2.3コード
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    const int maxn = 100010;
    char s1[maxn], s2[maxn]; //   dp               ,    1         
    
    int main(){
        while (~scanf("%s%s", s1 + 1, s2 + 1)){ //      1        
            int m = strlen(s1 + 1); //              1  !! 
            int n = strlen(s2 + 1);
            // lcs   
            int i = 1;
            for (int j = 1; j <= n; j++){
                if (s1[i] == s2[j])
                    i += 1;
            } 
            if (i == m + 1) printf("Yes
    "); else printf("No
    "); } return 0; }
    5.まとめ
    文字列のシリーズのテーマは有限を列挙して、よくある文字列の操作を熟知するべきで、添削を含んで調べて、およびいくつかの高めたデータの構造の使用、set、map、stringなどを含んで、プログラミングの効率を高めることができます.
    文字列の問題については、まとめを多くする必要があります.