字符串的查找

来源:互联网 发布:linux中没有yum命令 编辑:程序博客网 时间:2024/05/01 22:43

要求:字符串查找即在主串X中查找是否包含子串Y,与字符串包含不同的是,字符串的查找必须是连续的,即Y中的子串必须在X中连续的出现才算。

如:string main_str="ABCDEF";
string sub_str_1="BCD";
string sub_str_2="ACD";

则在主串main_str中能查找到子串sub_str_1,而不能查找到子串sub_str_2.所以输出结果为1,0.。注意字符串的查找与字符串的包含的不同,具体可参看我的博客字符串的包含。

思路:很容易知道此题实质上是字符串匹配,所以我们可以用简单模式匹配算法或kmp算法解决。

基于此思路代码如下:
#include<iostream>#include<string>using namespace std;bool str_find(string main_str,string sub_str){int start=0,j=0;int i=start;while(i<main_str.length()&&j<sub_str.length())//while(main_str[i]!='\0'&&sub_str[j]!='\0')//错误,因为string定义的//字符串末尾不包含'\0',应该用string类的length()属性{//while(j<sub_str.length())最好不while套while{if(main_str[i]==sub_str[j]){i++;j++;}else{//i++;//错误,不能直接这么写,因为当子串部分匹配时,i的值仍加了,所以得用一个标记符,暂存部分匹配时i的起始值,将该值加加start++;i=start;j=0;}}}if(j>=sub_str.length()){return true;}else{return false;}}void main(){int i=0;char *pstr="ABCDEF";string main_str="ABCDEF";string sub_str_1="BCD";string sub_str_2="ACD";cout<<str_find(main_str,sub_str_1)<<endl;cout<<str_find(main_str,sub_str_2)<<endl;//while(main_str[i]!='\0')//{//cout<<main_str[i];//i++;//}/*while(pstr[i]!='\0'){cout<<pstr[i];i++;}*///这一小段程序说明了在c++中用字符指针指向的字符串常量末尾都//自动的添加了'\0',但在string类定义的字符串常量末尾不包含'\0',cout<<endl;}
程序运行结果如下:
<img src="http://img.blog.csdn.net/20160310155915381" alt="" />



0 0