剪花布条 HDU - 2087 (子串位置查找总结)

今天做到了相关的题,感觉知识欠缺就想着写个总结加深一下记忆。

首先是今天看到的题:

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。
对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 

Input:

输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,
布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。

Output:

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。

Sample Input:

abcde a3
aaaaaa  aa
#

Sample Output:

0
3


这个题数据卡的不严,暴力可以很轻松地跑过去。
以下是暴力的写法:

#include<cstdio>
#include<iostream> 
#include<cmath> 
#include<cstring> 
using namespace std; 

char a[1005]; 
char b[1005];
 
int main() 
{ 
	while(scanf("%s",a+1))
	{ 
		if(a[1]=='#')break; 
		int result=0; 
		scanf("%s",b+1); 
		int len1=strlen(a+1); 
		int len2=strlen(b+1); 
		for(int i=1 ; i<=(len1-len2+1) ; i++) 
		{ 
			int t=i; 
			for(int j=1 ; j<=len2 ;) 
			{ 
				if(a[t]==b[j])  
				{ 
					t++; j++; 
					if(j == len2+1) 
					{ 
						j=1; 
						i=i+len2-1; 
						result++; 
						break; 
					} 
				} 
				else 
				{ 
					j=1; 
					break; 
				}  
			} 
		} 
		printf("%d\n",result); 
	} 
	return 0; 
} 

不过正所谓暴力肯定不是我们的最终目标,所以我上网查了查发现还有很多方法

一 :C语言库里有strstr()可以用。 需要头文件#include<cstring> || #include<string.h> 例如:strstr(s1,s2); 返回s2在s1中的第一个位置(有多个没法),返回类型是char *

二:C++中的string类的find函数 例如: string str1 = "asdasd"; int a = str1.find("asd",0); 最终a = 0   这里返回类型为int,即下标。 find里的第二个参数是代表从第几(下标)开始找。

三:Kmp算法,BM算法。

这个比较麻烦,直接上大神传送门  点击打开链接

posted @ 2017-08-27 21:03  Assassin_poi君  阅读(131)  评论(0编辑  收藏  举报