5.1补 机试笔记
string的操作
string str;
任意位置插入:str.insert(从哪插入,插入什么)
删除一段: str.erase(从哪,删到哪)
字符串长:str.size()
找特定字符或者字符串的下标:str.find("xxx"), 找到则返回下标,否则返回string::npos
注意‘1’字符直接用int转,并不是1,而是其ASCII码,可以用减‘0’。
字符串的模式匹配
KMP:
模式匹配的思想是,模式串匹配失败后,不能直接从主串的下一位继续开始,而是要根据已经匹配的信息,跳过一些一定不是的,因为主串匹配过的一部分和模式串的一样。
1. 确定next输出,即模式串每一个字符的next值,就是求该字符前的字符串,前缀=后缀的最大长度。ABA=2. ,默认next[0]=-1
int next[m];
next[0]=-1;
2. 直接让i=-1,j=0即让j在i后面。
int i=-1;
int j=0
3. 直接比较m次(模式串的长度),如果i和j对应的字符相等,那么让i,j都加1,然后next[j]=i;否则让i跳i=next[i];
void getnext(int m){
while(j<m){
if(i==-1||str[j]==str[i]){
i++;
k++;
next[j]=i;
}else i=next[i];
}
}
4. KMP匹配
int KMP(int n, int m) //n为主串长度,m为模式串
getnext(m);
int i, j=0; // i是主串,j是模式串
while(i<n&&j<m){
if(j=-1&&str[i]==str[j]){ // 如果匹配成功或者第一次就匹配失败
i++;
j++;
}else{
j=next[j]
}
}
if(j==m){
return i-j+1; // 如果匹配结束后j指向m,说明模式串已经全部匹配完毕,那么返回下标,此时i指向完成匹配的字符的最后一位,而 j 是长度,i+1=j求得 起始匹配位置,即所求下标
}else return -1;