两个字符串之续

两个字符串之续(KMP)

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来搞科研为人民作出自己的贡献;

博客内容:两个字符串;

博客时间:2014-4-5

编程语言:C++ (面向过程)

编程坏境:Windows 7 专业版

编程工具:vs2008 32位编译器

续集之原博客:两个字符串

  • 引言

陪女朋友玩了一天,真开心,晚上她回来就睡。。。我实现了一下KMP,总结于此,其实有时候问题真的没有我们想象的那么难,只要我们行动起来。

  • 题目

两个字符串 问题1 : 判断一个字符串是否是另一个字符串的字串,算法是KMP算法。

  • 思路

详细教程请看我的博客 KMP详解

  • 实验

程序截图

第一行输入 一个字符串a

第二行输入 一个字符串b

第三行输出 b是否是a的字串,如果是 则输出1 ,否则输出 0

接着循环测试如上

  • 代码

test.cpp

// head file
#include<iostream>
#include<string>
using namespace std;

// function: KMP 
// input: two string a.length >= b.length
// output: a bool result
// 功能:检测b是否是a的字串,若是返回 true,否则返回 false
bool _KMP_algorithm(string a,string b);


// function: main
int main()
{
	string a,b;
	while(cin>>a>>b)
		cout<<_KMP_algorithm(a,b)<<endl;
	system("pause");
	return 0;
}

// function: KMP 
// input: two string a.length >= b.length
// output: a bool result
// 功能:检测b是否是a的字串,若是返回 true,否则返回 false
bool _KMP_algorithm(string a,string b)
{
	if(!a.empty() && !b.empty())
	{
		if(a.length() >= b.length())
		{
			// first action
			int * yuchuli = new int[b.length()];
			yuchuli[0] = 0;
			string str1,str2;
	
			for(int i=1;i<b.length();i++)
			{
				yuchuli[i] = 0;
				for(int j=1;j <= i;j++)
				{
					str1 = b.substr(0,i-j+1);
					str2 = b.substr(j,i-j+1);
					if(str1.compare(str2) == 0)
					{
						yuchuli[i] = i-j+1;
						break;
					}
				}
			}

			// second action
			for(int i=0,j=0;i<a.length()&&j<b.length();)
			{
				if(a[i] != b[j])
				{
					if( j != 0 )
					{
						// j = j - (  (j-1+1)  -  yuchuli[j-1] ) = yuchuli[j-1]; 
						j =  yuchuli[j-1];
					}
					else i++;
				}
				else if(j == b.length()-1)
				{
					return true;
				}
				else 
				{
					j++;i++;
				}
			}
			return false;	

		}
		else return false;
	}
	else
	{
		cout<<"exception of function KMP_algorithm input"<<endl;
		return false;
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值