当前位置:网站首页>08_ strand
08_ strand
2022-07-02 15:13:00 【Listen to the rain】
strand
Empty string :“” —>“\0”
Space string :" " —>" \0"
Substring :
True string :


Suitable for the following string :
Not suitable for the following string :
1.BF Algorithm ( Simple algorithm )

// Simple algorithm BF Algorithm :1. Run backwards at the same time 2. If equal i++ j++ 3. If it's not equal i=i-j+1 j=0
int BF_Search(const char* str, const char* sub, int pos)// From the main string pos The subscript starts looking back for the substring
{
assert(str != NULL && sub != NULL && pos >= 0 && pos < strlen(str));
if (str == NULL || sub == NULL || pos < 0 || pos >= strlen(str))
{
// \0
return -1;
}
int lenstr = strlen(str);//lenstr Save the length of the main string
int lensub = strlen(sub);//lensub Save the length of the substring
int i = pos; //i Save the subscript of the main string matching
int j = 0; //j Save the subscript of substring matching
while (i < lenstr && j < lensub)// When the main string and string are not out of range , The cycle continues
{
if (str[i] == sub[j])// If equal be i and j meanwhile ++, Judge the next character
{
i++;
j++;
}
else // Representative mismatch If it doesn't match Then let i Go back to the next position before this match and j Zeroing
{
i = i - j + 1;//
j = 0;// The order of these two lines of code cannot be reversed
}
}
// here while The loop ends There are only two possibilities You need to judge i and j Who walked to the tail
if (j >= lensub)// If the string j Go to the tail It means that the match is successful
{
return i - j;// If the match is successful Then return the position before this successful match
}
// If the string j Did not go to the tail That means the main string doesn't have what the string wants Then return to -1
return -1;
}

2.KMP Algorithm ( Only related to substring )

Substring mismatch 2 In this case :

seek next Array :

Code implementation :
int* Get_next(const char* sub)//next Arrays are only related to substrings
{
//assert
int lensub = strlen(sub);//lensub Save the length of the substring
int* next = (int*)malloc(sizeof(int) * lensub);// Apply for an equal length next Array to hold each of them K value
assert(next != NULL);
next[0] = -1;//next The first two spaces of the array have fixed values -1 0
next[1] = 0;
int j = 1;//j Saved known k The subscript
int k = 0;
// Push through the unknown j Is known be j+1 It's unknown and j+1 To judge the legitimacy of ( Give Way j+1<lensub that will do )
while (j + 1 < lensub)// to next Each space of the array is assigned an appropriate value
{
if ((k == -1) || sub[j] == sub[k])// Two equal or k Back to -1
{
next[++j] = ++k;
/*k++; j++; next[j] = k;*/
}
else
{
k = next[k];//k Back to the right place
}
}
return next;// take malloc Applied next Throw out the array
}
int KMP_Search(const char* str, const char* sub, int pos)// From the main string pos The subscript starts looking backwards for the string
{
assert(str != NULL && sub != NULL && pos >= 0 && pos < strlen(str));
if (str == NULL || sub == NULL || pos < 0 || pos >= strlen(str))
{
return -1;
}
int lenstr = strlen(str);//lenstr Save the length of the main string
int lensub = strlen(sub);//lensub Save the length of the string
int i = pos; //i Save the subscript when the main string matches
int j = 0; //j Save the subscript when the substring matches
int* next = Get_next(sub);//next Arrays are only related to substrings
while (i < lenstr && j < lensub)// When the main string and string are not out of range , The cycle continues
{
if ((j == -1) || str[i] == sub[j])// If equal be i and j meanwhile ++, Judge the next character
{
i++;
j++;
}
else // Representative mismatch If it doesn't match Then let i Go back to the next position before this match and j Zeroing
{
//i = i-j+1;//
//j = 0;// The order of these two lines of code cannot be reversed
j = next[j];//j Return to the right place next[j]
}
}
// here while The loop ends There are only two possibilities You need to judge i and j Who walked to the tail
if (j >= lensub)// If the string j Go to the tail It means that the match is successful
{
return i - j;// If the match is successful Then return the position before this successful match
}
// If the string j Did not go to the tail That means the main string doesn't have what the string wants Then return to -1
return -1;
}
边栏推荐
- 关于网页中的文本选择以及统计选中文本长度
- 【NOI模拟赛】伊莉斯elis(贪心,模拟)
- 学习使用php将时间戳转换为大写日期的方法代码示例
- 04_ 栈
- C语言实现N皇后问题
- Learn the method code example of converting timestamp to uppercase date using PHP
- Sharp tool SPL for post SQL calculation
- MFC timer usage
- MathML to latex
- Ad20 cannot select the solution of component packaging in PCB editor
猜你喜欢
![[untitled] leetcode 2321 Maximum score of concatenated array](/img/a3/54d0e83f02ef0d0d8d269351c35b39.png)
[untitled] leetcode 2321 Maximum score of concatenated array

Advanced C language (learn malloc & calloc & realloc & free in simple dynamic memory management)

kibana 基础操作

MathML to latex

Full of knowledge points, how to use JMeter to generate encrypted data and write it to the database? Don't collect it quickly

MFC 定时器使用

vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases(sigmod‘2019)

C language exercises - (array)

Mavn 搭建 Nexus 私服

04_ 栈
随机推荐
表格响应式布局小技巧
MFC A对话框调用B对话框函数并传参
Deploy tidb cluster with tiup
Application of CDN in game field
Niuke Practice 101
Record an interview
为什么只会编程的程序员无法成为优秀的开发者?
数据分析常见的英文缩写(一)
可视化搭建页面工具的前世今生
实用调试技巧
TiDB混合部署拓扑
学习使用php实现公历农历转换的方法代码
06_栈和队列转换
记一次面试
19_Redis_宕机后手动配置主机
qml 弹窗框架,可定制
Tidb data migration scenario overview
CodeCraft-22 and Codeforces Round #795 (Div. 2)D,E
Learn the method code example of converting timestamp to uppercase date using PHP
HUSTPC2022