串的定义和实现(了解即可)
code
#include <iostream>
#include <cstring>
using namespace std;
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
} SString;
typedef struct
{
char *ch;
int length;
} HString;
void StrAssign(SString *T, char* chars)
{
int len = strlen(chars);
if (len > MAXLEN)
len = MAXLEN;
for (int i = 0; i < len; i++)
{
T->ch[i] = chars[i];
}
T->length = len;
}
void Strcopy(SString *T, SString S)
{
int len = S.length;
if (len > MAXLEN)
len = MAXLEN;
for (int i = 0; i < len; i++)
{
T->ch[i] = S.ch[i];
}
T->length = len;
}
int StrEmpty(SString S)
{
return S.length == 0;
}
int StrCompare(SString S, SString T)
{
int len1 = S.length, len2 = T.length;
int min_len = (len1 < len2) ? len1 : len2;
for (int i = 0; i < min_len; i++)
{
if (S.ch[i] > T.ch[i])
return 1;
if (S.ch[i] < T.ch[i])
return -1;
}
return (len1 - len2);
}
int StrEngth(SString S)
{
return S.length;
}
void Substring(SString *Sub, SString S, int pos, int len)
{
if (pos < 1 || pos > S.length || len < 1 || pos + len > S.length)
{
Sub->length = 0;
return;
}
for (int i = 0; i < len; i++)
{
Sub->ch[i] = S.ch[pos + i - 1];
}
Sub->length = len;
}
void Concat(SString *T, SString S1, SString S2)
{
int len1 = S1.length, len2 = S2.length;
if (len1 + len2 <MAXLEN)
{
for (int i = 0; i < len1 + len2; i++)
{
if (i < len1)
T->ch[i] = S1.ch[i];
else
T->ch[i] = S2.ch[i - len1];
}
T->ch[len1 + len2] = '\0';
}
T->length = len1 + len2;
}
int Index(SString S, SString T)
{
int len1 = S.length, len2 = T.length;
if (len2 == 0)
return 0;
if (len1 < len2)
return -1;
for (int i = 0; i <= len1 - len2; i++)
{
if (strncmp(S.ch + i, T.ch, len2) == 0)
return i+1;
}
return -1;
}
void Clearstring(SString *S)
{
S->length = 0;
}
void Destroystring(SString *S)
{
S->length = -1;
}
void printf(SString S){
for(int i=0;i<S.length;i++){
cout<<S.ch[i];
}
cout<<endl;
}
int main()
{
SString S1,S2,sub,T1;
char a[]="ktuh2agj";
char b[]="2agj";
char c[]="syw";
StrAssign (&S1,a);
StrAssign (&sub,c);
StrAssign (&T1,b);
cout<<"主串是: ";
printf(S1);
Strcopy(&S2,S1);
cout<<"复制的串的是: ";
printf(S2);
cout<<"是否空: "<<StrEmpty(S2)<<endl;
Clearstring(&S2);
cout<<"Clearstring后是否空: "<<StrEmpty(S2)<<endl;
Substring(&sub,S1,1,3);
cout<<"前三位子串是: ";
printf(sub);
cout<<"主串和字串比较: "<<StrCompare(S1,sub)<<endl;
SString T;
Concat(&T,S1,sub);
cout<<"连接主串和前三位子串后的字符串是: ";
printf(T);
cout<<"2agj的位置是"<<Index(S1,T1)<<endl;
return 0;
}
注意细节
1.下面是两种运算符的区别
2.下面是值传递、指针传递和引用传递
#include <iostream>
void changeValue(int num) {
num = 5;
}
void changeValue1(int* numPtr) {
*numPtr = 5;
}
void changeValue2(int& numRef) {
numRef = 5;
}
int main() {
int num = 10;
changeValue(num);
std::cout << "值传递不变: "<<num << std::endl;
int num1 = 10;
changeValue1(&num1);
std::cout <<"指针传递可改变: "<<num1 << std::endl;
int num2 = 10;
changeValue2(num2);
std::cout <<"引用传递可改变: " <<num2 << std::endl;
return 0;
}
串的模式匹配
BF算法
#include<iostream>
using namespace std;
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
} String;
int Index_BF(string s, string t) {
int i = 0, j = 0;
int lens = s.length();
int lent = t.length();
while (i <= lens - lent) {
j = 0;
while (j < lent && s[i + j] == t[j]) {
j++;
}
if (j == lent) {
return i;
}
i++;
}
return -1;
}
int main(){
string a="ktuh2agj";
string b="2agj";
cout<<Index_BF(a,b)<<endl;
return 0;
}
KMP算法
#include<iostream>
#include<cstring>
using namespace std;
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN];
int length;
} SString;
void get_next(SString T,int next[]){
int i=1,j=0;
next[1]=0;
while (i<T.length){
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;
next[i]=j;
}
else{
j=next[j];
}
}
}
int Index_KMP(SString S, SString T, int next[])
{
int i = 1, j = 1;
while (i <= S.length && j <= T.length)
{
if (j == 0 || S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
j = next[j];
}
if (j > T.length)
return i - T.length;
else
return 0;
}
void kmp(){
SString S, T;
int next[MAXLEN];
strcpy(S.ch, "ABABDABACDABABCABAB");
S.length = strlen(S.ch);
strcpy(T.ch, "ABABCABAB");
T.length = strlen(T.ch);
get_next(T, next);
printf("Next array: ");
for (int i = 1; i <= T.length; i++) {
printf("%d ", next[i]);
}
printf("\n");
int index = Index_KMP(S, T, next);
if (index != 0) {
printf("Pattern found at index: %d\n", index);
} else {
printf("Pattern not found.\n");
}
}
int main(){
kmp();
return 0;
}