5.1补 机试笔记

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值