Description
设s、t为两个字符串,利用定长顺序存储结构的串操作,判断t是否为s的子串。如果是,输出子串所在位置(第一个字符)。
Input
输入为两行,第一行为s串,第二行为t串
Output
输出为一行(子串所在位置)。
Sample Input
abcdefghijk
cde
Sample Output
3
//子串判断
#include <bits/stdc++.h>
using namespace std;
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
// c4-1.h 串的定长顺序存储表示
#define MAXSTRLEN 255 // 用户可在255以内定义最大串长(1个字节)
typedef char SString[MAXSTRLEN+1]; // 0号单元存放串的长度
// bo4-1.cpp 串采用定长顺序存储结构(由c4-1.h定义)的基本操作(14个)
// SString是数组,故不需引用类型。此基本操作包括算法4.2,4.3,4.5
Status StrAssign(SString T,char *chars)
{ // 生成一个其值等于chars的串T
int i;
if(strlen(chars)>MAXSTRLEN)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
int StrCompare(SString S,SString T)
{ // 初始条件: 串S和T存在
// 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
int i;
for(i=1;i<=S[0]&&i<=T[0];++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}
Status SubString(SString Sub,SString S,int pos,int len)
{ // 用Sub返回串S的第pos个字符起长度为len的子串。算法4.3
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1){
return ERROR;
}
for(int i=1;i<=len;i++){
Sub[i]=S[pos+i-1];
}
Sub[0]=len;
return OK;
}
int Index(SString S,SString T,int pos)
{ // 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
// 其中,T非空,1≤pos≤StrLength(S)。算法4.5
int i=pos,j=1;
while(i<=S[0]&&j<=T[0]){
if(S[i]==T[j]){
++i;
++j;
}
else{
i=i-j+2;
j=1;
}
}
if(j>T[0]){
return i-T[0];
}
else{
return 0;
}
}
int main()
{
SString S,T,Sub;
char s[300],t[300];
int ans[300];
gets(s);
gets(t);
StrAssign(S,s);
StrAssign(T,t);
int len1=strlen(s);
int len2=strlen(t);
int cnt=0;
for(int i=1;i<=len1-len2+1;i++){
SubString(Sub,S,i,len2);
if(StrCompare(Sub,T)==0){
cnt++;
ans[cnt]=i;
}
}
for(int i=1;i<=cnt;i++){
if(i!=1){
printf(" ");
}
printf("%d",ans[i]);
}
//printf("\n");
}