串的逻辑结构和线性表相似,不过串的数据类型是字符。在串的基本操作中,通常以一个串作为操作对象。

基本概念

①当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。
②一个串中任意个连续字符组成的子序列(含空串,但不含串本身)称为该串的子串。
例如,“a”、“ab”、“ab”都是“abc”的子串。

串的存储结构

①行结构
以一个定长的数组进行存储,0号位置存储串长

②堆结构
若是非空串,则按串长分配存储区,否则指针指向为NULL

③块链存储结构
串值也可用链表来存储,由于串的数据元素是一个字符,因此用链表存储时,通常一个结点中存放的不是一个字符,而是若干个字符

串匹配的简单算法

Brute-Force(BF)算法,又称简单匹配算法、平凡算法
问题描述:
存在两个串,主串,子串,要在主串中匹配到子串的位置

算法描述:
从主串和子串的开头部分进行比较。若两者相等,则同时向后遍历,若能够匹配到子串结尾,则表示匹配成功,记录位置。若在比较过程中,两者不等,则主串回溯为匹配开始的下一位,子串重置,重新开始匹配。

具体实现:

/**
  * 使用bf算法将字串与主串进行匹配
  * @param main 主串(由于java的char类型无法存储串长,首位未存放值)
  * @param son  字串
  * @return   匹配到的位置(不成功返回0)
  */
 public static int countLocate(char main[],char son[]) {
  	//提前记录长度,减少比较时的运算量
  	int maLength = main.length;
  	int soLength = son.length;
  	for(int i=1; i< maLength; i++) {
   		for(int j=1; j< soLength; j++) {
    			if(main[i] != son[j]) {
     				//不相等,主串回溯,跳出此层循环
     				i=i-j+1;      
     				break;
    			}    
    			if(j == soLength-1) {
   				 //匹配到了子串尾部,匹配成功
    				 return i-j+1; 
    			}
    
    			i++;
   			if(i > maLength-1) {
   				 //先加一,再判断,可避免"av"和 "avvvvv"匹配成功
     				return 0;
    			}
   		}
 	 }
 	 return 0;
 }

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值