C#数据结构 串

C#数据结构 串

精选文章moguli202025-06-23 20:18:385A+A-

串是一种数据元素为字符的特殊的线性表。


1. 串的定义

零个或多个字符(字母、数字或其他字符)组成的有限序列。记为 S="a1a2...an"S="a1a2...an",长度为 nn,空串长度为0。


2.串的术语

串长度:串中字符的个数。

空串:零个字符的串。即:"",通常用φ表示。

字符位置:字符在序列中的序号。

空格串:由一个或多个空格组成的串。

子串:串中任意个连续的字符组成的子序列。

主串:包含子串的串。

子串位置:子串的第一个字符在主串中的位置。

串相等:两个串的值相等,即两个串的长度相等,各个对应位置的字符都相等。

3.串的基本运算

strassign (s, chars) //串赋值

strCompare (S,T) //串比较

strLength(S) //求串长

concat(T, S1, S2) //串联接

subString(S, sub, pos, len) //求子串

strCopy(T, S) //串拷贝

strEmpty(S) //串判空

clearString (S) //清空串

index(S, T, pos) //子串的位置

replace(S, T, V) //串替换

strInsert(S, pos, T) //子串插入

strDelete(S, pos, len) //子串删除

4. 串的存储结构


顺序存储:使用数组存储字符,末尾可加结束符(如C的\0)。优点:随机访问高效;缺点:插入/删除需移动元素。


链式存储:每个节点存储一个或多个字符,通过指针链接。优点:动态扩展方便;缺点:空间利用率低,操作复杂。


5. 模式匹配算法

(1)暴力匹配(Brute-Force)

过程:主串指针i和模式串指针j逐个比较,失败时i回溯到i-j+1,j重置为0。


时间复杂度:O(mn)O(mn)。


(2)KMP算法

核心思想:利用部分匹配信息(最长公共前后缀),避免主串回溯。


步骤:


构造next数组:记录模式串每个位置的最长公共前后缀长度。


匹配过程:主串指针i不回溯,模式串指针j根据next数组跳转。


next数组构造:


void getnext( SqString T, int next[ ] )

{ int j, k;

next[0] = -1;

j = 0; k = -1; //k=next[j]

while( j < T.length-1 )

{ if ( k == -1 || T.str[j] == T.str[k] )

{ next[j+1] = k+1;

j++;

k++; //k=next[j]

}

else k = next[k]

}

}

时间复杂度:O(m+n)O(m+n),适用于频繁匹配的场景。


6. 代码示例(KMP算法实现)


int Index_KMP( SqString S, SqString T )

{ int i, j, next[200];

getnext(T, next);

i=0; j=0;

while( i<S.length && j<T. length )

{ if( j == -1|| S.str[i] ==T.str[j] )

{ i++; j++;

}

else j = next[j];

}

if(j>=T.length) return i-T.curlen+1; //返回位序

else return 0;

}

总结

串是数据处理的基础结构,其高效操作依赖于合理的存储设计和算法选择。掌握KMP算法及其next数组的构造是解决复杂字符串匹配问题的关键。实际应用中需结合场景权衡不同方法的优缺点。

点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2