版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
字符串的定义
字符串时零个或多个字符组成的有限序列,只包含空格的字符串称为空格串。串中所包含的字符个数称为串的长度,长度为零的字符串称为空串。字符串中仁义个连续的字符组成的子序列称为该串的子串子串的第一个字符在主串中的序号称为子串在主串中的位置。
字符串的比较是根据字典序排的每个字符都有一个ASCII码这些就代表了字符之间的大小关系。
模式匹配,从一个主串的第一个字符中开始和模式T(T就是要匹配的那个子串)的第一个字符开始比较如果相同则比较后续的直到匹配完成,否则就主串的字符往后移一位再重新匹配。
int Index(string s, string t){
int lens = s.length();//计算串s、t的长度
int lent = t.length();
int i = 0;
int j = 0;
while (i < lens&&j < lent){//如果i、j都各自小于lens和lent
if (t[j] == s[i]){//如果子串的t[j]和主串的s[i]相等
++i;//各自索引都自增
++j;
}
else{//否则,主串的索引比刚开始后移一个;子串的索引变为0
i = i - j + 1;
j = 0;
}
}
if (j == lent){//如果最j和lent的大小一样,证明找到了,返回子串在主串中的索引
return i - lent;
}
else{//否则返回-1
return -1;
}
}
kmp算法 关键的是一个NEXT数组该数组存储的NEXT【i】表示以i为结尾的字串和主串第一位开始的最大匹配长度。
next(char *T ,int next[])
{
int i=1,j=0,k=0;
int Tlen = strlen(T);
next[0] = 0;
next[1] = 0;
while(i < Tlen)
{
printf("next while %d,T[i%d]=%c,T[j%d]=%c\n",k++,i,T[i],j,T[j]);
if(T[i] == T[j] || j==0)
{
++i;
++j;
next[i] = j;
} else {
j = next[j];
}
}
for(i=0 ; i<Tlen ; i++)
printf(" next[%d]= %d ",i,next[i]);
printf("\n");
return;
}
数组的存储
数组存储在内存中始终都是一维存储。
压缩存储
对称数组压缩存储只需要存上三角或者下三角矩阵就行
对角矩阵存储
eg。
2,1,0,0,0,
9,3,4,0,0,
0,7,5,3,0,
0,0,5,4,2,
0,0,0,1,1
只有对角线及其两侧有数据有两种存储方式一种是把所有的行都压到一边 令t为压缩矩阵的行s为压缩矩阵的列,那么t=i,s=j-i+1;另一种方式就是按行存储
稀疏矩阵由于0太多就可以省略不填只记录每个有数据的坐标以及数据组成的一个三元组,一个结构体数组就可以实现。
或者采用十字链表的方法一个基本节点数据类型包含两个指针一个指向同行的下一个非零节点和下一个同列的非零节点。