0. 发一下个人感想:
作为一个大三学生,呀,不不不,快失业的社会人士,本来打算一天一章博客,从数据结构开始,到操作系统,计算机网络,数据库,线性代数,概率论,算法等方面的知识进行介绍,大一大二打了两年的ACM,最好的成绩居然是省赛三等奖和校赛一等奖的时候就果断放弃了ACM的道路,只能怪自己懂得太慢,不过还来得及,想学习,什么时候都不算晚。之后我会对我这两年来走过的ACM做次总结以及个别简单题目的分析和代码实现,基础知识完成之后,在慢慢讲一些我学到的机器学习,深度学习以及Spring的知识,希望大家能多多支持。此外,也希望能给那些还在迷茫的人一些建议,Find your dream,Never let go。
此外,由于最近放假,乡下人嘛,也没有什么地方可以放电脑就没再更新博客,之后会陆续更新,希望大家多多支持。
华丽的开始:
1. 介绍:
串是由零个或多个字符组成的有限序列,一般记为s=a1a2a3a4...an。串中字符的个数称为串的长度,串中任意个连续的字符组成的子序列称为子串。包含子串的串相应的为主串。两个串是相同的,当且仅当这两个串的值是相同的。
2. 串的功能介绍:
一个串,简单地说,比如C++的string,Java的Spring,它们都是特别常用的库和对象。一般包含以下的功能:
创建串,复制串,串的长度,串是否为空,串的基本操作符运算,清空串,子串所在的首个位置,子串所在的最后一个位置等功能。
(1) 类的基本定义模板:
class String
{
public:
String();
String(const char *ch);
String(const String &st);
~String();
int length();
bool empty();
void clear();
char& operator[](int index);
bool operator==(const String &s) const;
bool operator<=(const String &s) const;
bool operator>=(const String &s) const;
String& operator=(const String st);
String& operator=(const char *st);
String operator+(const String st);
String operator+(const char* st);
String& operator+=(const String st);
String& operator+=(const char *st);
bool operator<(const String s) const;
bool operator>(const String s) const;
friend ostream & operator<<(ostream &os,const String &s);
friend istream & operator>>(istream &is,String &st);
private:
int len;
char *str;
};
(2) 串的基本运算:
串的相加(+,+=):对于相加,返回一个新的串,然后再根据其他操作操作该字符串。相加赋值运算就直接修改函数所有者。
String String::operator+(const String st)
{
char *temp = new char[len + st.len +1];
for(int i=0;i<len;i++) temp[i] = str[i];
for(int i=0;i<st.len;i++) temp[i + len] = st.str[i];
temp[len + st.len] = '\0';
return String(temp);
}
String String::operator+(const char* st)
{
char *temp = new char[len + strlen(st) +1];
for(int i=0;i<len;i++) temp[i] = str[i];
for(int i=0;i<strlen(st);i++) temp[i + len] = st[i];
temp[len + strlen(st)] = '\0';
return String(temp);
}
String& String::operator+=(const String st)
{
char *temp = new char[len + st.len +1];
for(int i=0;i<len;i++) temp[i] = str[i];
for(int i=0;i<st.len;i++) temp[i + len] = st.str[i];
len = len + st.len;
delete[] str;
str = new char[len];
strcpy(str,temp);
delete[] temp;
return *this;
}
String& String::operator+=(const char *st)
{
char *temp = new char[len + strlen(st) +1];
for(int i=0;i<len;i++) temp[i] = str[i];
for(int i=0;i<strlen(st);i++) temp[i + len] = st[i];
temp[len + strlen(st)] = '\0';
len = len + strlen(st);
delete[] str;
str = new char[len];
strcpy(str,temp);
delete[] temp;
return *this;
}
串的等于(=):直接修改原来的串。注意,不要直接将指针地址赋值给字符串,因为这样当这个指针地址被delete时,该字符串里面的内容也被delete,这不符合字符串的操作。
String& String::operator=(const String st)
{
if(this == &st)
return *this;
delete[] str;
len = st.len;
str = new char[len+1];
strcpy(str,st.str);
return *this;
}
String& String::operator=(const char *st)
{
delete[] str;
len = strlen(st);
str = new char[len+1];
strcpy(str,st);
return *this;
}
串的比较(>,<,==):串的比较函数比较简单,可以参考《C++ prime plus 第六版》第十二章。这些都可以用来练C++的功底。
bool String::operator==(const String &s) const
{
if(s.len != len) return false;
if(strcmp(s.str,str) != 0) return false;
return true;
}
bool String::operator<=(const String &s) const
{
if(s.len < len) return false;
if(strcmp(str,s.str) > 0) return false;
return true;
}
bool String::operator>=(const String &s) const
{
if(s.len > len) return false;
if(strcmp(str,s.str) < 0) return false;
return true;
}
bool String::operator<(const String s) const
{
if(len < s.len) return true;
if(len == s.len && strcmp(str,s.str) < 0) return true;
return false;
}
bool String::operator>(const String s) const
{
if(len > s.len) return true;
if(len == s.len && strcmp(str,s.str) > 0) return true;
return false;
}
串的数组取值([]):这个也比较简单,直接返回就OK了。
char& String::operator[](int index)
{
return str[index];
}
(3) 串的流输入和输出
这个也可以用来练习C++,详细可以参考《C++ Prime Plus 第六版》第十二章。
输入最多只支持999999个字符的输入。
ostream & operator<<(ostream &os,const String &s)
{
os << s.str;
return os;
}
istream & operator>>(istream &is,String &st)
{
char temp[999999];
is.get(temp,999999);
if(is)
st=temp;
while(is && is.get() != '\n')
continue;
return is;
}
(4) 其他零碎的功能
其他的诸如长度,是否为空就留给大家去练练。这与其说是数据结构,不如说是C++的补习。
3. 串的应用
*串的应用我独自写几个博客介绍,毕竟都很难。
(1) KMP算法以及子串查询
(2) 最长公共子串(DP算法,暂不介绍后缀数组算法)
(3) Manacher最长回文子串