字符串的查找

要求:字符串查找即在主串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="" />



你可能感兴趣的:(数据结构,字符串,指针,简单模式匹配)