南昌理工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;
}