集训第四周:字符串(KMP,输入)

本文详细介绍了C++中字符串输入的各种方法,包括cin、cin.get()、cin.getline()、getline()、gets()和getchar(),并讨论了它们的区别和使用场景。此外,还讲解了字符串匹配的基本概念和暴力算法,重点阐述了KMP算法的工作原理,通过next()函数避免模式串回溯,提高匹配效率。
摘要由CSDN通过智能技术生成

南昌理工acm集训

字符串的输入:

cin、cin.get()、cin.getline()、getline()、gets()、getchar()的用途和区别(字符串基础不好,补充下基础的问题)
(1)cin<<
用法一:最常用、最基本的用法,输入一个数字:

  int a,b;
  cin>>a>>b;
  cout<<a+b<<endl;

用法二:接受一个字符串,遇“空格”、“Tab”、“回车”都结束

  char a[20];
  cin>>a;
  cout<<a<<endl;

2. cin.get( , )
用法一:cin.get(字符数组名,接收字符数)用来接收一行字符串,可以接收空格

char a[20];
cin.get(a,20); 
cout<<a<<endl;

用法二:cin.get(字符变量名)可以用来接收字符

char ch;
ch=cin.get(); 
cout<<ch<<endl;

用法三:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符, 或者舍弃回车, 弥补cin.get(字符数组名,接收字符数目)的不足.

char arr[10];
    cin.get(arr,10);
    cin.get();
    cout<<arr<<endl;
    cin.get(arr,5);
    cout<<arr<<endl;
    system("pause");
    return 0;

3.cin.getline( , )
cin.getline(): 接受一个字符串,可以接收空格并输出

char m[20];
cin.getline(m,5);
cout<<m<<endl;

延伸:
cin.getline()实际上有三个参数,cin.getline(接受字符串到m,接受个数5,结束字符)
当第三个参数省略时,系统默认为’\0’ 是‘/n’吧。

4. getline()
getline() :接受一个字符串,可以接收空格并输出,需包含

 string str;
    getline(cin,str);
    cout<<str<<endl;

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
5. gets()
gets(): 接受一个字符串,可以接收空格并输出,需包含 #include。

char m[20];
    gets(m); 
    cout<<m<<endl;

类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面
6.getchar()
getchar() :接受一个字符

char ch;
    ch=getchar(); //不能写成getchar(ch);
    cout<<ch<<endl;

getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;
以上内容参考大佬Asfortoday的博客

字符串匹配:

字符串匹配中的几个概念

模式串:等待被在主串中匹配的串
主串:被模式串匹配的串
字符串匹配:在主串中查找模式串的过程
比如对于主串: aabbcc 与模式串:aa 来说,一般所要进行的匹配是在主串中查找模式串第一次出现的位置,比如模式串:aa 在主串:aabbcc 中第一次出现的位置是1。
暴力算法的实现
设i指针为主串s第i位置的字符,j指针为模式串p第j位置的字符,最开始i与j均从0开始,当s[i]==p[j]时,i++,j++,主串与模式串开始比较下一位。当s[i]!=p[j]时,j设为0,i设为上一次s[i]==p[j]时i的值加1,即将模式串往后滑动一位,并且模式串与主串的匹配再次从模式串的第0个字符开始,若搜索到模式串即记录下来,若未搜索到模式串,将会在i指针到达主串s末尾时结束程序。
很显然时间复杂度为O(nm)。代码:

int BFMatch(char *s, char *p) 
{
          int i,j;
          i =0;
          whi1e(i < strlen(s)) 
          {
                    j=8;
                    while(s[i] == p[j] &8j<str1en(p)) 
                    {
                                i++;
                                j++;
                    }
                   if(strlen(p) == j) {
                   return i - strlen(p);
                   i=i-j+1;
                    }
                   return -1
}

KMP算法:

KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。
KMP算法利用已经部分匹配这个有效信息,保持i指针(主串)不回溯,通过修改j指针,让模式串尽量地移动到有效的位置
例如:
如果主串为:a b c a b c d h i j k
模式串为:a b c e
当我们匹配到主串的第四个字符a时,可知a和e不相等,因此需要移向下一位,但其实我们并不需要从模式串中的第一位重新开始比较,因为主串中的前三个字符已经没有未匹配的a了,不可能匹配成功。
其完整带,代码为:

 int KMP(string T,string p)
    {
        int i=0;
        int j=0;
        int* next=getNext(T);
        while (i < (int)T.length() && j < (int)p.length())
        {
            if (j == -1 || T[i] == p[j])
            {
                i++;
                j++;
            }
            else
            {
                j=next[j];
            }
        }
        if (j == (int)p.length())
        {
            return i-j;
        }
        return -1;
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值