#include<stdio.h>#include<string.h>#include<stdlib.h>typedefint Position;#define NotFound -1voidBuildMatch(char*pattern,int*match ){
Position i, j;int m =strlen(pattern);
match[0]=-1;for( j=1; j<m; j++){
i = match[j-1];while((i>=0)&&(pattern[i+1]!=pattern[j]))
i = match[i];if( pattern[i+1]==pattern[j])
match[j]= i+1;else match[j]=-1;}}
Position KMP(char*string,char*pattern ){int n =strlen(string);int m =strlen(pattern);
Position s, p,*match;if( n < m )return NotFound;
match =(Position *)malloc(sizeof(Position)* m);BuildMatch(pattern, match);
s = p =0;while( s<n && p<m ){if( string[s]==pattern[p]){
s++; p++;}elseif(p>0) p = match[p-1]+1;else s++;}return( p==m )?(s-m): NotFound;}intmain(){char string[]="This is a simple example.";char pattern[]="simple";
Position p =KMP(string, pattern);if(p==NotFound)printf("Not Found.\n");elseprintf("%s\n", string+p);return0;}
#include<iostream>
#include<vector>
#include<stack>
#include<string>
#define defaultsize 128
#define init1 0
using namespace std;
class String
{
public:
String(int sz = defaultsize);
String(const char* init);
String(const String& s);
~String() { delete[]ch; }
int length()const { return curlength; }
int operator==(String& s)const { return strcmp(ch, s.ch) == 0; }
int operator!=(String& s)const { return strcmp(ch, s.ch) != 0; }
bool empty(String& s)const;
String& operator=(String& s);
String& operator += (String & s);
char& operator[](int i);
friend ostream& operator<<(ostream& out, String& s);
int find(String& s, int k=init1)const;
private:
char* ch;
int curlength;
int maxsize;
};
String::String(int sz)
{
maxsize = sz;
ch = new char[maxsize + 1];
curlength = 0;
ch[0] = '\0';
}
String::String(const char* init)
{
int len = strlen(init);
maxsize = (len > defaultsize) ? len : defaultsize;
ch = new char[maxsize + 1];
curlength = len;
strcpy(ch, init);
}
String::String(const String& s)
{
maxsize = s.maxsize;
ch = new char[maxsize + 1];
curlength = s.curlength;
strcpy(ch, s.ch);
}
bool String::empty(String& s) const
{
if (curlength == 0)
return true;
return false;
}
String& String::operator=(String& s)
{
delete[] ch;
ch = new char[s.maxsize];
curlength = s.curlength;
strcpy(ch, s.ch);
return *this;
}
String& String::operator+=(String& s)
{
char* temp = ch;
int n = curlength + s.curlength;
int m = (maxsize >= n) ? maxsize : n;
delete[]ch;
ch = new char[m];
maxsize = m;
curlength = n;
strcpy(ch, temp);
strcat(ch, s.ch);
delete[]temp;
return *this;
}
char& String::operator[](int i)
{
return ch[i];
}
ostream& operator<<(ostream& out, String& s)
{
for (int i = 0; i < s.curlength; i++)
out << s[i];
return out;
}
int String::find(String& s,int k) const
{
int i, j;
for (i = k; i <= curlength - s.curlength; i++)
{
for (j = 0; j < s.curlength; j++)
if (ch[i + j] != s.ch[j])break;
if (j == s.curlength)
return i;
}
return -1;
}
int main()
{
String s("asdsad");
cout << s << endl;
string ss = "asdasda";
string sss(ss);
cout << sss << endl;
cout << ss.find("asd") << endl;
}