• 【数据结构】字符串匹配(暴力匹配)


    原理解析:

    字符串匹配方法,创建两个字符串结构,主 串和子串比较。

    主串字符 a 和 子串字符 c 不匹配,主串的指针向下移动,移动到上一次开始比较的下一个位置。 子串指向开始的位置。

    主串字符 b 和 子串字符 c 不匹配,主串的指针继续指向上一次开始比较的下一个位置。子串指向开始的位置。

    主串字符 c 和 子串字符 c 匹配, 主串指针和子串指针同时向下一个位置移动。

    主串字符 e 和 子串字符 e 匹配,主串指针和子串指针同时向下一个位置移动。

    这个时候主串和子串的指针都会指向空,所以判定是否匹配成功的标准就是子串指针移动的次数等于子串的长度。 

    ⚠为什么不是主串移动的次数等于主串长度为标准?

    原因:这个子串可能匹配不成功,但是主串也指针一定会一个接一个的走完所有字符。

    实践代码:

    1. #include
    2. #include
    3. typedef struct String {
    4. char* data;
    5. int len;
    6. }String;
    7. String* initString() {
    8. String* s = (String*)malloc(sizeof(String));
    9. s->data = NULL;
    10. s->len = 0;
    11. return s;
    12. }
    13. // 添加字符串
    14. void stringAssign(String* s, char* data) {
    15. // s 里面有数据就释放清空,防止野指针
    16. if (s->data) {
    17. free(s->data);
    18. }
    19. int len = 0;
    20. char* temp = data;
    21. // 计算添加的字符串的长度
    22. while (*temp) {
    23. len++;
    24. temp++;
    25. }
    26. if (len == 0) {
    27. s->data = NULL;
    28. s->len = 0;
    29. }
    30. else {
    31. // 重置 temp 使其指向data首元素
    32. temp = data;
    33. s->len = len;
    34. // 开辟数据空间
    35. s->data = (char*)malloc(sizeof(char) * (len + 1)); // 字符串结尾 /0
    36. // 把字符串一个一个放进去
    37. for (int i = 0; i < len; i++, temp++) {
    38. s->data[i] = *temp;
    39. }
    40. }
    41. }
    42. void printfString(String* s) {
    43. for (int i = 0; i < s->len; i++) {
    44. printf(i == 0 ? "%c" : "->%c", s->data[i]); // 三目运算符去决定有没有->(不重要但很好)
    45. }
    46. printf("\n");
    47. }
    48. // 暴力匹配
    49. void forceMatch(String* master, String* sub) {
    50. // 主串
    51. int i = 0;
    52. // 字串
    53. int j = 0;
    54. while (i < master->len && j < sub->len) {
    55. if (master->data[i] == sub->data[j]) {
    56. i++;
    57. j++;
    58. }
    59. else {
    60. // 指向主串上一次起点的下一个位置
    61. i = i - j + 1;
    62. // 字串直接从头开始
    63. j = 0;
    64. }
    65. }
    66. if (j == sub->len) {
    67. printf("匹配成功");
    68. }
    69. else {
    70. printf("不成功");
    71. }
    72. }
    73. int main() {
    74. String* s1 = initString();
    75. String* s2 = initString();
    76. stringAssign(s1, "helloworld");
    77. stringAssign(s2, "owo");
    78. printfString(s1);
    79. printfString(s2);
    80. forceMatch(s1, s2);
    81. return 0;
    82. }

     运行结果:

  • 相关阅读:
    Bigemap 在生态环境督察工作中的应用
    小程序导航栏透明,精准设置小程序自定义标题的高度和定位
    DNS的原理介绍
    完全日期(蓝桥杯)
    2022-2028全球油气无人机行业调研及趋势分析报告
    哪些人需要考PMP®证书呢?考了PMP®证书有什么用呢?
    程序员的自我修养-编译链接
    Android 使用poi生成Excel ,word并保存在指定路径内
    dubbo:从零理解及搭建dubbo微服务框架(一)【附带源码】
    多场景,跨平台测试,Neptune CHT-C助力用户打造安全的座舱环境
  • 原文地址:https://blog.csdn.net/xuan3215/article/details/127586589