已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是()。A.i=1,j=0B.i=5,j=0C.i=5,j=2D.i=6,j=2

题目

已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是()。

A.i=1,j=0

B.i=5,j=0

C.i=5,j=2

D.i=6,j=2


相似考题
参考答案和解析
正确答案:C
更多“已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是()。A.i=1,j=0B.i=5,j=0C.i=5,j=2D.i=6,j=2”相关问题
  • 第1题:

    给定下面的代码: int i=1,j=10; do { if(i++>--j) continue; }while(i<5) 执行完之后,i与j的值分别是多少? ( )

    A.i=6,j=5

    B.i=5,j=5

    C.i=6,j=4

    D.i=5,j=6


    正确答案:D
    解析:该题考查对自增自减运算符的理解。假如op是操作数,自增自减运算符有下面几种形式。++op、op++,表示对操作数op加1,其中,++op表示先对op加1然后再取其值,而。op++表示先取其值,然后再对op进行加1。 --op、op--,表示对操作数op进行减1操作,其中,--op表示先对op减1然后再取其值,而op--表示先取其值,然后再对op进行减1。在本题中,当进行到i=5时退出循环,此时j为6。故本题答案是D。

  • 第2题:

    阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

    【函数】

    void QuickSort( int A[ ],int s,int t)

    { int i=s,j=t+1,temp;

    int x=A[s];

    do{

    do i ++ ;while (1);

    do j -- ;while(A[j]>x);

    if(i<j){temp=A[i];(2);(3);}

    }while(i<j);

    A[a] =A[j];A[j] =x;

    if(s<i-1) (4);

    if(j+1<t) (5);

    }


    正确答案:(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(Asj-1) (5)QuickSort(Aj+1t);
    (1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(A,s,j-1) (5)QuickSort(A,j+1,t); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

  • 第3题:

    inti=0,j=1;if((i++==1)&&(j++==2)){i=42;}System.out.println(i=+i+,j=+j);Whatistheresult?()

    A.i=1,j=2

    B.i=1,j=1

    C.i=42,j=2

    D.i=42,j=1

    E.Compilationfails.


    参考答案:B

  • 第4题:

    有以下程序 include include void fun(char s[][10],int n

    有以下程序 #include <stdio.h> #include <string.h> void fun(char s[][10],int n) { char t; int i j; for (i=0; i<n-1; i++) for 0--i+l; j<n; j++) /*比较字符串的首字符大小,并交换字符串的首字符*/ if(s[i][0] > s[j][0]) { t = s[i][0]; s[i][0] = s[j][0]; s[j][0] = t;} } main() { char ss[5][10]= {"bcc", "bbcc", "xy", "aaaacc", "aabcc" }; fun(ss, 5); printf("%s,%s\n", ss[0],ss[4]); } 程序的运行结果是

    A.xy, aaaacc

    B.aaaacc,xy

    C.xcc,aabcc

    D.acc,xabcc


    正确答案:D
    解析:在函数fun()中有一个两层嵌套的for循环,外循环变量i从0递增到n-2,内循环变量i从i+1循环递增到n-1,这是选择排序算法的标准结构。循环体中因为逆序条件为“s[i][0]> s[j][0]”,所以实现的是升序排序。由此可见,fun()函数实现的功能是对一个二维字符数组前n行的首字符进行升序排序。主函数中定义的二维数组初始化为{"bcc",”bbcc", "xy","aaaacc","aabcc"},通过fun()函数的排序后,结果将为acc","abcc","by", "baaacc","xabcc"}。故最终输出字符串ss[0]和ss[4]的结果为acc,xabcc,应该选择D。

  • 第5题:

    阅读以下程序: include void main() { static int a[][3]={9,7,5,3,1,2,4,6,8}; int

    阅读以下程序:

    include<iostream.h>

    void main()

    {

    static int a[][3]={9,7,5,3,1,2,4,6,8};

    int i,j,s1=0,s2=0;

    for(i=0;i<3;i++)

    for(j=0;j<3;j++)

    {

    if(i==j)s1=sl+a[i][j];

    if(i+j==2)s2=s2+a[i][j];

    }

    cout<<s1<<","<<s2<<endl;

    }

    则该程序的输出结果为【 】。


    正确答案:1810
    18,10

  • 第6题:

    有以下程序:struct S{int n;int a[20];};void f(struct S*P){int i,j,t;for(i=0;in-1;i++)fo

    有以下程序: struct S{int n;int a[20];}; void f(struct S*P) { int i,j,t; for(i=0;i<P->n-1;i++) for(j=j+1;j<P->n-1;j++) if(p->a[i]>p->a[j]) {t=P->a[i];p->a[i]=P->a[j];p->a[j]=t} } main() {int i;struct S s{10,{2,3,1,6,8,7,5,4,10,9}}; f(&s); for(i=0;i<s.n;i++)printf("%d",s.a[i]);} 程序运行后的输出结果是( )。

    A.3

    B.4

    C.5

    D.6


    正确答案:A
    解析:在主函数main()中定义了一个整型变量i和一个结构体变量s。f()函数中,定义了一个结构体指针类型的指针p,外层循环变量i表示数组的第i个元素,内层循环j表示数组的第i+1个元素,调用f()函数,通过指针变量p来引用结构体成员,并把它们进行从小到大排序,最后输出。

  • 第7题:

    有以下程序includeincludevoidfun(char,*s[],intn){char*t;inti,j; for(i=

    有以下程序 #include <stdio.h> #include <string.h> void fun(char,*s[],int n) { char *t; int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(strlen(s[i])>strlen(s[j])) {t=s[i];s[i]:s[j];s[j]=t;} } main() { char *ss[]={"bcc","bbcc","xy","aaaacc","aabcc"}; fun(ss,5); printf("%s,%s\n",ss[0],ss[4]); } 程序的运行结果是

    A.xy,aaaacc

    B.aaaacc,xy

    C.bcc,aabcc

    D.aabcc,bcc


    正确答案:A
    解析:函数fun(char,s[],int n)的功能是对字符串数组的元素按照字符串的长度从小到大排序。在主函数中执行fun(ss,5)语句后,*ss[]={"xy","bcc","bbcc","aabcc","aaaacc"},ss[0],ss[4]的输出结果为xy,aaaacc。

  • 第8题:

    有以下程序

    #include <stdio.h>

    #include <string.h>

    void fun(char s[][10],int n)

    {char t; int i,j;

    for(i=0;i<n-1;i++)

    for(j=i+1;j<n;j++)

    /*比较字符串的首字符大小 ,并交换字符串的首字符*/

    if(s[i][0]<s[j][0]) {t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}

    }

    main()

    {char ss[5][10]={“bcc”,”bbcc”,”xy”,”aaaacc”,”aabcc”};

    fun(ss,5); printf(“%s,%s\n”,ss[0],ss[4]);

    }

    程序的运行结果是( )。

    A.xy,aaaacc

    B.aaaacc,xy

    C.xcc,aabcc

    D.acc,xabcc


    正确答案:D

  • 第9题:

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
    【说明】
    模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1。
    KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:
    1.在串t和串s中,分别设比较的起始下标i=j=0。
    2.如果串t和串s都还有字符,则循环执行下列操作:
    (1)如果j=-l或者t[i]=s[j],则将i和j分别加1,继续比较t和s的下一个字符;
    (2)否则,将j向右滑动到next[j]的位置,即j =next[j]。
    3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回-1。
    其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。
    【C代码】
    (1)常量和变量说明
    t,s:长度为lt和ls的字符串
    next:next数组,长度为ls
    (2)C程序

    #include #include#include/*求next[]的值*/void get_next( int*next, char *s, int ls) { inti=0,j=-1; next[0]=-1;/*初始化next[0]*/ while(i< ls){/*还有字符*/ if(j==-1lls[i]==s[j]){/*匹配*/ j++; i++; if(s[i]==s[j]) next[i]= next[j]; else Next[i]= j; }else j = next[j]; }} int kmp( int*next, char *t ,char *s, int lt, int ls ) { Inti= 0,j =0 ; while(i < lt && (1) ){ if(j==-1 || (2) ){ i++ ; j++ ; }else (3) ;}if (j >= ls)return (4) ;else return-1;}

    【问题1】(8分)
    根据题干说明,填充C代码中的空(1)~(4).
    【问题2】(2分)
    根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。
    【问题3】(5分)
    根据C代码,字符串"BBABBCAC"的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为"AABBCBBABBCACCD",子串为"BBABBCAC",则函数Kmp的返回值是(7)。


    答案:
    解析:
    【问题1】
    (1):j (2):t[i]==s[j];
    (3):get_next(next, s, ls);
    j=next[j];
    (4):i+1-ls;
    【问题2】(2分)
    (5)O(ls+lt)
    【问题3】
    (6)[-1, -1,1, -1, -1, 2, 0, 0],
    (7)6

  • 第10题:

    写出算法的功能。intfun(sqstring*s,sqstring*t,intstart){inti=start-1,j=0;while(ilen&&jlen)if(s->data[i]==t->data[j]){i++;j++;}else{i=i-j+1;j=0;}if(j>=t->len)returni-t->len+1;elsereturn-1;}


    正确答案: 串的模式匹配算法

  • 第11题:

    下列代码段inti=1,j=10;do{???if(i++>--j)continue;}while(i<5);执行完毕后,i和j的值分别是()。

    • A、i=6?j=5
    • B、i=5?j=5
    • C、i=6?j=4
    • D、i=5?j=6

    正确答案:A

  • 第12题:

    单选题
    有以下程序:#include #include void fun(char *s[],int n){ char *t; int i,j; for(i=0;i  for(j=i+1;j   if(strlen(s[i])>strlen(s[j]))   {    t=s[i];    s[i]=s[j];    s[j]=t;   }}main(){ char *ss[]={"bcc","bbcc","xy","aaaacc","aabcc"}; fun(ss,5); printf("%s,%s",ss[0],ss[4]);}程序的运行结果是(  )。
    A

    xy,aaaacc

    B

    aaaacc,xy

    C

    bcc,aabcc

    D

    aabcc,bcc


    正确答案: B
    解析:
    函数fun的功能:将字符串数组 s中前n个字符串按照字符串的长度由小到大进行排序,要求输出数组的第一个和第五个字符串的内容,答案选择A选项。

  • 第13题:

    在执行完此程序段后,i,j值为 int i=1,j=10; do{ if(++i>j--)continue; }while(i<5);

    A.i=6 and j=5

    B.i=5 and j=5

    C.i=6 and j=4

    D.i=5 and j=6


    正确答案:D
    解析:本题考查考生对自增自减运算符的理解。++op和op++,表示对操作数op加1,其中++op表示先对op加1然后再取值,而op++表示先取值,然后再对op进行加1。--op和op--也是一样。当进行到i=5时退出循环,此时j为6。

  • 第14题:

    执行下面的程序段后i和j的结果为 int i=1,j=10; do { if(i++>--j)continue; } while(i<5);

    A.i=6,j=5

    B.i=5,j=5

    C.i=6,j=4

    D.i=5,j=6


    正确答案:D
    解析:本题考查考生对自增自减运算符的理解。++op和op++,表示对操作数op加1,其中++op表示先对op加1然后再取值,而op++表示先取值,然后再对op进行加1。-op和op--也是一样,当进行到i=5时退出循环,此时j为6。因此,本题正确答案为选项D。

  • 第15题:

    inti=0,j=5;tp;for(;;){i++;for(;;){if(i>--j){breaktp;breaktp;}}System.out.println(i=”+i,j=”+j);}Whatistheresult?()

    A.i=1,j=0

    B.i=1,j=4

    C.i=3,j=4

    D.i=3,j=0

    E.Compilationfails.


    参考答案:B, D

  • 第16题:

    有以下程序 main() {int a[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}},i,j,k,t; for(i=0;i<4;i++) for(j=0;j<3;j++) for(k=j+1;k<4;k++) if(a[j][i]>a[k][i]){t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;}/*按列排序*/ for(i=0;i<4;i++)printf("%d,",a[i][i]);

    A.1,6,5,7,

    B.8,7,3,1,

    C.4,7,5,2,

    D.1,6,2,1,


    正确答案:A
    解析: 本题利用多重for循环的嵌套来实现对二维数组元素的按列排序。利用最外层循环来实现对列的控制。内部循环利用选择法对数组元素按照从小到大的顺序进行排列,最后输出对角线上的元素值。

  • 第17题:

    有以下程序 #include<stdio.h> #include<string.h> void fun(char s[][10],int n) { char t;int i,j; for(i=0;i<n-1;j++) for(j=i+1,j<n;j++) /*比较字符串的首字符大小,并交换字符串的首字符*/ if(s[0])>s[i][c]{t=s[i][o];s[i][o]=s[j][o];s [j][0]=t;} } main { char ss[5][10]="bcc","bbcc","xy","aaaacc"," aabcc"} fun(ss,5);printf("%s,%s",ss[0],ss[4]); } 程序运行结果是( )。

    A.xy,aaaacc

    B.aaaacc,xy

    C.xcc,aabcc

    D.acc,xabcc


    正确答案:D
    函数fun(chars[][10],intn)比较二维字符数组s[][10]的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首字符。

  • 第18题:

    在执行完此程序段后,i,j值为 int i=1-10; do{ if(++i>j--)continue; } while(i<5);

    A.i=6 and j=5

    B.i=5 and j=5

    C.i=6 and j=4

    D.i=5 and j=6


    正确答案:D
    解析:本题考查考生对自增自减运算符的理解。++op和op++,表示对操作数op加1,其中++op表示先对op加I然后再取值,而op什表示先取值,然后再对op进行加1。-op和op一也是一样。当进行到i=5时退出循环,此时i为6。

  • 第19题:

    试题四(共15分)

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

    【说明】

    模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。

    如果匹配成功,返回s在t中的位置,否则返回-1 。

    KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:

    1.在串t和串s中,分别设比较的起始下标i=J=O

    2.如果串t和串s都还有字符,则循环执行下列操作:

    (1)如果j=-l或者t[i]-s[j],则将i和j分别加1,继续比较t和s的下一个字符;

    (2)否则,将j向右滑动到next[j]的位置,即j =next[J]

    3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回一1.

    其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。

    【C代码】

    (1)常量和变量说明

    t,s:长度为悯铂Is的字符串

    next:next数组,长度为Is

    (2)C程序

    include <stdio.h>

    nclude <stdliB.h>

    include <string.h>

    /*求next【】的值*/

    void get_next( int *next, char *s, int Is) {

    int i=0,j=-1;

    next[0]=-1;/*初始化next[0]*/

    while(i< ils){/*还有字符*/

    if(j=-1l ls[i]=s[j]){/*匹配*/

    j++;

    i++;

    if( s[i]一s[jl)

    next [i]- next[j];

    else

    Next[i]=j;

    }

    else

    J= next[j];

    }

    }

    int kmp( int *next, char *t ,char *s, int.lt, int Is )

    {

    inti= 0,j =0 ;

    while (i<lt && ( 1 ) {

    if( j=-1 II 2_) {

    i++ ;

    j ++ ;

    } else

    (3) :

    }

    if (j>= ls)

    Retum (4)

    else .

    retum-1;

    【问题1】(8分)

    根据题干说明,填充C代码中的空(1)~(4).

    【问题2】(2分)

    根据题干说明和C代码,分析出kmp算法的时间复杂度为 (5)(主串和子的长度分别为It和Is,用O符号表示)。

    【问题3】(5分)

    根据C代码,字符串“BBABBCAC”的next数组元素值为 (6) (直接写素值,之间用逗号隔开)。若主串为“AABBCBBABBCACCD”,子串为“BBABBCAC则函数Kmp的返回值是 (7)


    正确答案:

  • 第20题:

    main( )

    { int a[6]={10,20,30,40,50,60},i;

    invert(a,0,5);

    for(i=0;i<6;i++) printf(“%d,”,a[i]);

    printf(“\n”);

    }

    invert(int s[ ],int i,int j)

    { int t;

    if(i<J)

    { invert(s,i+1j-1);

    t=s[i];s[i]=s[j];s[j]=t;

    }

    }


    正确答案:
    3.60,50,40,30,20,10,

  • 第21题:

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
    【说明】 模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1 。
    KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下: 1.在串t和串s中,分别设比较的起始下标i=j=0。 2.如果串t和串s都还有字符,则循环执行下列操作: (1)如果j=-l或者t[i]=s[j],则将i和j分别加1,继续比较t和s的下一个字符; (2)否则,将j向右滑动到next[j]的位置,即j =next[j]。 3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回-1. 其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。【C代码】
    (1)常量和变量说明
    t,s:长度为悯铂Is的字符串
    next:next数组,长度为Is
    (2)C程序
    #include
    #include
    #include
    /*求next[]的值*/
    void get_next( int *next, char *s, int Is)
    {
    int i=0,j=-1;
    next[0]=-1;/*初始化next[0]*/
    while(i < ls){/*还有字符*/
    if(j==-1l
    ls[i]==s[j]){/*匹配*/
    j++;
    i++;
    if( s[i]==s[j])
    next[i]
    = next[j];
    else
    Next[i]
    = j;
    }
    else
    j = next[j];
    }
    }
    int kmp( int *next, char *t ,char *s, int
    lt, int Is )
    {
    Int i=
    0,j =0 ;
    while
    (i < lt && (1) ){
    if(
    j==-1 || (2) ){
    i
    ++ ;
    j
    ++ ;
    }
    else
    (3) ;
    }
    if (j >= ls)
    return (4) ;
    else
    return -1;
    } 【问题1】(8分)
    根据题干说明,填充C代码中的空(1)~(4).
    【问题2】(2分)
    根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。
    【问题3】(5分)
    根据C代码,字符串“BBABBCAC”的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为“AABBCBBABBCACCD”,子串为“BBABBCAC”,则函数Kmp的返回值是(7)。


    答案:
    解析:
    【问题1】(8分)答:(1):j
    【问题2】(2分)答:(5)O(ls+lt)

    【问题3】(5分)答:(6)[-1, -1,1, -1, -1, 2, 0, 0](7)6

  • 第22题:

    函数实现串的模式匹配算法,请在空格处将算法补充完整。intindex_bf(sqstring*s,sqstring*t,intstart){inti=start-1,j=0;while(ilen&&jlen)if(s->data[i]==t->data[j]){i++;j++;}else{i=();j=0;}if(j>=t->len)return();elsereturn-1;}}/*listDelete*/


    正确答案:i-j+1 i-t->len+1

  • 第23题:

    填空题
    函数实现串的模式匹配算法,请在空格处将算法补充完整。intindex_bf(sqstring*s,sqstring*t,intstart){inti=start-1,j=0;while(ilen&&jlen)if(s->data[i]==t->data[j]){i++;j++;}else{i=();j=0;}if(j>=t->len)return();elsereturn-1;}}/*listDelete*/

    正确答案: i-j+1 i-t->len+1
    解析: 暂无解析