赞
踩
学习贺利坚老师关于B-F算法的算法库
数据结构例程——串的模式匹配(Brute-Force算法)_sqstring s, t; strassign(s,"ababcabcacbabcaccab");-CSDN博客
本人规则解析博客
V1.0: 在原有的博客基础上, 加入我构建的算法库, 让博客更完全 , 代码可以运行看效果, 不是让算法仅仅停留在 逻辑方面, 这也是后续我努力的方向, 把这些算法模型, 尽可能的去运用到实际的嵌入式项目中, 把理论变成实物 , 本次也进行了名字优化, 让逻辑更清晰
利用B-f算法,寻找子串在母串中的位置
- /**************************************************
- 函数名: Find_matching_location
- 功 能: 利用B-f算法,寻找子串在母串中的位置
- 参 数: (1)Sequential_string Mother_String:母串
- (2)Sequential_string Son_String:子串
- 思 路: 从开始逐个对比,如果对比不成功, 则起始位置前移, 计数器初始化, 直到超出长度或找到
- 注 意: 我们判断是否找到的标志,就是判断 子串计数器是否对比完,然后跳出
- 返回值: int: -1--没找到, 其他:找到,返回其数组位序
- **************************************************/
- int Find_matching_location(Sequential_string Mother_String,Sequential_string Son_String)
- {
- int Mother_counter,Son_counter;//同步计数器
- int Mother_begin;//每次对比从母串开始的位置
- Mother_counter = 0;
- Son_counter = 0;
- Mother_counter = 0;
- //Brute-Force算法
- while((Mother_begin+Mother_counter) < Mother_String.length && Son_counter < Son_String.length)
- {
- if(Mother_String.Sequential_string_data[Mother_begin+Mother_counter] == Son_String.Sequential_string_data[Son_counter])
- {
- Mother_counter++;
- Son_counter++;
- }
- else
- {
- Mother_begin++;
- Mother_counter = 0;
- Son_counter = 0;
- }
- }
- //通过判断子串计数器的溢出数值,得出是否找到
- if(Son_counter >= Son_String.length)
- {
- return Mother_begin;
- }
- else
- {
- return (-1);
- }
- }
Sequential_string.h
- #ifndef _SEQUENTIAL_STRING_H_INCLUDE
- #define _SEQUENTIAL_STRING_H_INCLUDE
-
- #include <stdio.h>
- #define MaxSize 100 //最多字符个数
-
- //顺序串数据结构
- typedef struct
- {
- char Sequential_string_data[MaxSize];//数组串数据
- int length; //实际串长
- }Sequential_string;
-
- //(1)将一个字符串数组赋值给顺序串
- void Assignment_Sequential_string(Sequential_string &New_String, char Assign_array[]);
- //(2) 复制一个串,到另一个串
- void Copy_Sequential_String(Sequential_string &accept_string, Sequential_string copy_string);
- //(3)判断两个串是否相等
- bool Equal_Sequential_String(Sequential_string judge_string1, Sequential_string judge_string2);
- //(4)求顺序串串长
- int Length_Sequential_String(Sequential_string measure_string);
- //(5)串连接
- Sequential_string Connect_Sequential_String(Sequential_string link1, Sequential_string link2);
- //(6)求子串(从begin_loation开始的number个字符)
- Sequential_string Get_Sequential_Substring(Sequential_string substring, int begin_loation, int number);
- //(7)插入串(从从begin_loation开始插入字符串,然后组合成新的串)
- Sequential_string Insert_Sequential_String(Sequential_string old_string, int begin_loation,Sequential_string insert_string);
- //(8)删除串(从begin 开始的number个字符)
- Sequential_string Delete_Sequential_String(Sequential_string old_string, int begin_loation,int number);
- //(9)串替换(从begin 开始的number个字符)
- Sequential_string Replace_Sequential_String(Sequential_string old_string, int begin_loation,int number,Sequential_string new_string);
- //(10)输出展示串
- void Display_Sequential_String(Sequential_string show_String);
- #endif
Sequential_string.cpp
- #include "Sequential_string.h"
-
- /**************************************************
- (1)函数名: Assignment_Sequential_string
- 功 能: 将一个字符串数组赋值给顺序串
- 参 数: (1)Sequential_string &New_String:创建的新串
- (2)char Assign_array[]: 原始字符串数组
- 注 意: 顺序数组,结尾加入'\0'
- 返回值: 无
- **************************************************/
- void Assignment_Sequential_string(Sequential_string &New_String, char Assign_array[])
- {
- int counter;
- for(counter = 0; Assign_array[counter] != '\0'; counter++)
- {
- New_String.Sequential_string_data[counter] = Assign_array[counter];
- }
- New_String.Sequential_string_data[counter] = '\0';
- New_String.length = counter; //更新串最大位序
- }
-
- /**************************************************
- (2)函数名: Copy_Sequential_String
- 功 能: 复制一个串,到另一个串
- 参 数: (1)Sequential_string &accept_string: 复制成的串
- (2)Sequential_string copy_string:要复制的串
- 注 意: 复制成的串,传回的是地址,所以不用传回参数
- 返回值: 无
- **************************************************/
- void Copy_Sequential_String(Sequential_string &accept_string, Sequential_string copy_string)
- {
- int counter;
- for(counter = 0; counter < copy_string.length;counter++)
- {
- accept_string.Sequential_string_data[counter] = copy_string.Sequential_string_data[counter];
- }
- accept_string.Sequential_string_data[counter] = '\0';
- accept_string.length = copy_string.length;
- }
- /**************************************************
- (3)函数名: Equal_Sequential_String
- 功 能: 判断两个串是否相等
- 参 数: (1)Sequential_string judge_string1:第一个串
- (2)Sequential_string judge_string2:第二个串
- 返回值: bool?是否相等,true:false
- **************************************************/
- bool Equal_Sequential_String(Sequential_string judge_string1, Sequential_string judge_string2)
- {
- bool same = true;
- int counter;
- if(judge_string1.length != judge_string2.length)
- {
- same = false;
- }
- else
- {
- for(counter = 0; counter < judge_string1.length;counter++)
- {
- if(judge_string1.Sequential_string_data[counter] != judge_string2.Sequential_string_data[counter])
- {
- same = false;
- break;
- }
- }
- }
- return same;
-
- }
-
- /**************************************************
- (4)函数名: Length_Sequential_String
- 功 能: 求顺序串串长
- 参 数: Sequential_string measure_string:要进行测量的串
- 返回值: int:顺序串长度信息
- **************************************************/
- int Length_Sequential_String(Sequential_string measure_string)
- {
- return measure_string.length;
- }
-
- /**************************************************
- (5)函数名: Connect_Sequential_String
- 功 能: 把两个串连接成一个串
- 参 数: Sequential_string link1, Sequential_string link2:两个要链接的串
- 返回值: 返回Sequential_string Connection_string: 链接成的串
- **************************************************/
- Sequential_string Connect_Sequential_String(Sequential_string link1, Sequential_string link2)
- {
- Sequential_string Connection_string;
- int counter;
- Connection_string.length = link1.length + link2.length;
- //将第一个串加入链接的串
- for(counter = 0; counter < link1.length; counter++)
- {
- Connection_string.Sequential_string_data[counter] = link1.Sequential_string_data[counter];
- }
- //将第二个串加入链接的串
- for(counter = 0; counter < link2.length; counter++)
- {
- Connection_string.Sequential_string_data[link1.length+counter] = link2.Sequential_string_data[counter];
- }
- Connection_string.Sequential_string_data[link1.length+counter] = '\0';
- return Connection_string;
- }
-
- /**************************************************
- (6)函数名: Get_Sequential_Substring
- 功 能: 求子串(从begin_loation开始的number个字符)
- 参 数: (1)Sequential_string mother_String:母串
- (2)int begin_loation:开始分割子串的位置
- (3)int number:子串的数量
- 返回值: Sequential_string son_String:得到的子串
- **************************************************/
- Sequential_string Get_Sequential_Substring(Sequential_string mother_String, int begin_loation, int number)
- {
- Sequential_string son_String;
- int counter;
- son_String.length = 0;
- if(begin_loation <= 0 || begin_loation > mother_String.length || number < 0 || begin_loation+number-1>mother_String.length)
- {
- //错误:分割的子字符串的位置错误。
- printf("\nError<6>:The position of the divided substring is wrong.\n");
- return son_String; // 参数不正确返回空串
- }
- for(counter = begin_loation-1; counter < begin_loation+number-1; counter++)
- {
- son_String.Sequential_string_data[counter-begin_loation+1] = mother_String.Sequential_string_data[counter];
- }
- son_String.Sequential_string_data[counter-begin_loation+1] = '\0';
- son_String.length = number;
- return son_String;
- }
-
- /**************************************************
- (7)函数名: Insert_Sequential_String
- 功 能: 插入串(从从begin_loation开始插入字符串,然后组合成新的串)
- 参 数: (1)Sequential_string old_string:在原始串的基础上插入
- (2)int begin_loation: 插入的位置
- (3)Sequential_string insert_string:插入的新串
- 思 路: 在原有串的基础上,割开一个口子,放上新串,然后组合成新串
- 返回值: Sequential_string form_string:组合成的新串
- **************************************************/
- Sequential_string Insert_Sequential_String(Sequential_string old_string, int begin_loation,Sequential_string insert_string)
- {
- int counter;
- Sequential_string form_string;
- form_string.length = 0;
- //参数不正确, 返回空串
- if(begin_loation <= 0 || begin_loation > old_string.length+1)
- {
- //错误:插入位置错误
- printf("\nError<7>: wrong insertion position.\n");
- return form_string;
- }
- for(counter = 0; counter < begin_loation-1;counter++)
- {
- form_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
- }
-
- for(counter = 0; counter < insert_string.length;counter++)
- {
- form_string.Sequential_string_data[begin_loation-1+counter] = insert_string.Sequential_string_data[counter];
- }
-
- for(counter = begin_loation-1; counter<old_string.length;counter++)
- {
- form_string.Sequential_string_data[insert_string.length+counter] = old_string.Sequential_string_data[counter];
- }
- form_string.Sequential_string_data[insert_string.length+counter] = '\0';
- form_string.length = old_string.length + insert_string.length;
- return form_string;
-
- }
- /**************************************************
- (8)函数名: Delete_Sequential_String
- 功 能: 删除串(从begin 开始的number个字符)
- 参 数: (1)Sequential_string old_string:在原有串的基础上删除
- (2)int begin_loation: 开始删除的位置(从逻辑1开始)
- (3)int number:删除的数量
- 注 意: 要判断删除的位置和数量是否正确
- 返回值:Sequential_string new_string:删除完后的新串
- **************************************************/
- Sequential_string Delete_Sequential_String(Sequential_string old_string, int begin_loation,int number)
- {
- int counter;//定义计数器
- Sequential_string new_string;
- new_string.length = 0;
- //合法性判断(begin_loation理应从1开始到leng长度)
- if(begin_loation <= 0 || begin_loation > old_string.length || (begin_loation+number-1) > old_string.length)
- {
- //错误:删除的位置或数量错误。
- printf("Error<8>: Wrong location or quantity of deletion.");
- return new_string;//返回空串
- }
- //择出删除位置之前的串
- for(counter = 0; counter < begin_loation-1;counter++)
- {
- new_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
- }
- //择出删除位置之后的串
- for(counter = begin_loation+number-1; counter < old_string.length; counter++)
- {
- new_string.Sequential_string_data[counter-number] = old_string.Sequential_string_data[counter];
- }
- new_string.Sequential_string_data[counter-number] = '\0';
- new_string.length = old_string.length - number;
- return new_string;
- }
-
- /**************************************************
- (9)函数名: Replace_Sequential_String
- 功 能: 串替换(从begin 开始的number个字符)
- 参 数: (1)Sequential_string old_string:原始串
- (2)int begin_loation:开始替换的位置
- (3)int number:替换的字符个数
- (4)Sequential_string replace_string:要替换成的字符串
- 思 路: 锁定old_string从begin_loation开始的number个字符,
- 然后开始剪切建立新串,
- ①把begin_loation之前的字符加入新串,
- ②要替换成的串加入,
- ③锁定后的字符加入
- ④组合成新串,返回传出
- 注 意: 最后加'\0'
- 返回值: Sequential_string new_string:替换后,产生的新串
- **************************************************/
- Sequential_string Replace_Sequential_String(Sequential_string old_string, int begin_loation,int number,Sequential_string replace_string)
- {
- int counter;
- Sequential_string new_string;
- new_string.length = 0;
- //合法性判断
- if(begin_loation <= 0 || begin_loation > old_string.length || begin_loation+number-1>old_string.length)
- {
- //错误:要替换位置出现错误
- printf("\nError<9>: There is an error in the position to be replaced.\n");
- return new_string;//返回空串
- }
- //开始复制剪切
- for(counter = 0; counter < begin_loation-1; counter++)
- {
- new_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
- }
- //加入要替换的串
- for(counter = 0; counter < replace_string.length; counter++)
- {
- new_string.Sequential_string_data[begin_loation-1+counter] = replace_string.Sequential_string_data[counter];
- }
- //被替换位置,后面剩余的串
- for(counter = begin_loation+number-1; counter < old_string.length; counter++)
- {
- new_string.Sequential_string_data[counter-number+replace_string.length] = old_string.Sequential_string_data[counter];
- }
- new_string.Sequential_string_data[counter-number+replace_string.length] = '\0';
- new_string.length = old_string.length - number + replace_string.length;
- return new_string;
- }
-
-
-
- /**************************************************
- (10)函数名: Display_Sequential_String
- 功 能: 输出展示串
- 参 数: Sequential_string show_String:要输出展示的串
- 注 意: 字符串后续可以换成自定义类型
- 返回值: 无
- **************************************************/
- void Display_Sequential_String(Sequential_string show_String)
- {
- int counter;
- if(show_String.length > 0)
- {
- for(counter = 0; counter < show_String.length; counter++)
- {
- printf("%c", show_String.Sequential_string_data[counter]);
- }
- printf("\n");
- }
- }
- int main()
- {
- //在母串里面找子串
- Sequential_string Mother_String;
- Sequential_string Son_String;
-
- char Mother_String_array[] = {'a','b','a','b','c','a','b','c','a','c','b','a','b','\0'};
- char Son_String_array[] = {'a','b','c','a','c','\0'};
- //把两个字符串创建成字符串
- Assignment_Sequential_string(Mother_String, Mother_String_array);
- Assignment_Sequential_string(Son_String, Son_String_array);
- printf("\nMother_String:\n");
-
- Display_Sequential_String(Mother_String);
- printf("\nSon_String:\n");
- Display_Sequential_String(Son_String);
- printf("\n%d\n",Find_matching_location(Mother_String,Son_String));
-
- return 0;
- }
main.cpp
- #include <stdio.h>
- #include "Sequential_string.h"
-
- /**************************************************
- 函数名: Find_matching_location
- 功 能: 利用B-f算法,寻找子串在母串中的位置
- 参 数: (1)Sequential_string Mother_String:母串
- (2)Sequential_string Son_String:子串
- 思 路: 从开始逐个对比,如果对比不成功, 则起始位置前移, 计数器初始化, 直到超出长度或找到
- 注 意: 我们判断是否找到的标志,就是判断 子串计数器是否对比完,然后跳出
- 返回值: int: -1--没找到, 其他:找到,返回其数组位序
- **************************************************/
- int Find_matching_location(Sequential_string Mother_String,Sequential_string Son_String)
- {
- int Mother_counter,Son_counter;//同步计数器
- int Mother_begin;//每次对比从母串开始的位置
- Mother_counter = 0;
- Son_counter = 0;
- Mother_counter = 0;
- //Brute-Force算法
- while((Mother_begin+Mother_counter) < Mother_String.length && Son_counter < Son_String.length)
- {
- if(Mother_String.Sequential_string_data[Mother_begin+Mother_counter] == Son_String.Sequential_string_data[Son_counter])
- {
- Mother_counter++;
- Son_counter++;
- }
- else
- {
- Mother_begin++;
- Mother_counter = 0;
- Son_counter = 0;
- }
- }
- //通过判断子串计数器的溢出数值,得出是否找到
- if(Son_counter >= Son_String.length)
- {
- return Mother_begin;
- }
- else
- {
- return (-1);
- }
- }
-
-
- int main()
- {
- //在母串里面找子串
- Sequential_string Mother_String;
- Sequential_string Son_String;
-
- char Mother_String_array[] = {'a','b','a','b','c','a','b','c','a','c','b','a','b','\0'};
- char Son_String_array[] = {'a','b','c','a','c','\0'};
- //把两个字符串创建成字符串
- Assignment_Sequential_string(Mother_String, Mother_String_array);
- Assignment_Sequential_string(Son_String, Son_String_array);
- printf("\nMother_String:\n");
-
- Display_Sequential_String(Mother_String);
- printf("\nSon_String:\n");
- Display_Sequential_String(Son_String);
- printf("\n%d\n",Find_matching_location(Mother_String,Son_String));
-
- return 0;
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。