感悟
主要是串的初始化,连接函数,赋值函数,求串的长度。求串的长度也在其中,但是我没有将其输出。还有BF算法,但是是求所有可能出现的位置,由于我是从下标0开始存的,所以与书上的不太一样。要注意一下,当获得第一个位置之后,i和j应该怎么移动。
#include <bits/stdc++.h>
using namespace std;
vector<int>V;
typedef struct {
char *elem;
int length;
}SString;
void init(SString &S)
{
S.elem = new char[1001];
S.length = 0;
}
void stringsign(SString &s)
{
string s1;
cin >> s1;
for(int i = 0 ; i < s1.size(); ++i)
{
s.elem[i] = s1[i];
}
int len = s1.size();
s.elem[len] = '\0';
s.length = s1.size();
}
int getlength(SString s)
{
return s.length;
}
SString connect(SString &s1,SString &s2,SString s3)
{
for(int i = 0; i < s1.length; ++i)
{
if(s1.elem[i] == '\0')
break;
s3.elem[i] = s1.elem[i];
}
for(int i = 0; i < s2.length ; i++)
{
s3.elem[i + s1.length] = s2.elem[i];
}
s3.elem[s1.length + s2.length ] = '\0';
s3.length = s1.length + s2.length;
return s3;
}
void BF(SString s1, SString s2)
{
int i = 0;
int j = 0;
while(i < s1.length)
{
while(i < s1.length && j < s2.length)
{
if(s1.elem[i] == s2.elem[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if(j == s2.length) V.push_back(i - j);
i = i - j + 1;
j = 0;
}
}
int main()
{
SString s,s1,s2;
init(s);
init(s1);
init(s2);
cout << "请输入子串1:" << endl;
stringsign(s); //字符串赋值函数
cout << "请输入子串2:" << endl;
stringsign(s1);
cout << "正在输出连接后的羊肉串。" << endl;
s2 = connect(s,s1,s2);
for(int i = 0 ; i < s2.length; ++i)
cout << s2.elem[i];
cout << endl;
cout << "请输入串1 :" << endl;
stringsign(s1);
cout << "请输入串2 :" << endl;
stringsign(s2);
cout << "正在查找串2在串1中所有出现的位置...(下标从0开始)" << endl;
BF(s1,s2);
if(V.size() == 0)
cout << "没有查找到该子串." << endl;
else
for(int i = 0; i < V.size(); ++i)
{
cout << V[i] << endl;
}
}