剪花布条 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算法。
这个比较麻烦,直接上大神传送门 点击打开链接