• 串学习笔记


    一、概念:串string是由零个或多个字符组成的有限序列,又名字符串。

    1、有限,指长度是一个有限的数值。零个字符的串称为空串NULL string,它的长度为0。

    2、序列,说明串的相邻字符之间具有前驱和后继关系。

    空格串:只包含空格的串。空格串是有内容有长度的,要与空串区别开。

    子串和主串:串中任意个数的连续字符组成的子序列称为该串的子串;相应的,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。

    二、串的比较

    1、在C语言中比较两个串是否相等,必须是它们串的长度以及它们各个对应位置的字符都相等时,才算是相等。

    例如:要查找主串str中"abcdabcef",找到ttr子串"abcef"的位置。思路:从主串str第一位开始,str和ttr前3个字符都是匹配的,但是str主串中第4个字符d与子串ttr中的第4个字符e不匹配,所以就重新匹配。从主串str的第2个字符开始,发现,str中的第二个字符与子串中的第一个字符a不匹配,所以重新匹配。从str中第3个字符开始,与ttr第一个字符开始匹配。。。。(简单的说:就是对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配,对主串做大循环,每个字符开头做ttr长度的小循环,直到匹配成功或全部遍历结束。)

    在比较的过程中,如果两串中字符相等,则继续往后匹配判断,如果不相等,记录主串当前位置的值必须退回到上次匹配首位的下一位,而记录子串当前位置的值退回到子串的首位。

     1 int Index(char *str, char *ttr, int pos)
     2 {
     3     int nStr, nTtr, sCnt, tCnt;
     4     nStr = strlen(str);  
     5     nTtr = strlen(ttr);
     6     sCnt = tCnt = 0;
     7 
     8     while (sCnt <= nStr && tCnt <= nTtr)
     9     {
    10         if (str[sCnt] == ttr[tCnt])
    11         {
    12             ++sCnt;
    13             ++tCnt;
    14         }
    15         else
    16         {
    17             sCnt = sCnt - tCnt + 1;
    18             tCnt = 0;
    19         }
    20     }
    21     if (tCnt > nTtr)
    22         return sCnt - nTtr;
    23     else
    24         return 0;
    25 }

     上面的方法是普通的模式匹配算法,但是这种算法有时效率不高,存在大量的重复遍历情况。

    KMP模式算法:(克努拉-莫里斯-普拉特算法)

  • 相关阅读:
    2021寒假每日一题《棋盘挑战》
    2021寒假每日一题《货币系统》
    2021寒假每日一题《红与黑》
    2021寒假每日一题《字母图形》
    2021寒假每日一题《完全背包问题》
    2021寒假每日一题《找硬币》
    python 迭代器和生成器
    python for循环
    python集合
    python字符串常用操作
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2938643.html
Copyright © 2020-2023  润新知