1:基本概念
串是字符串的简称。其结构也是一种特殊的线性表。由零个或零个以上的字符组成的优先序列,一般记为:
s="a1a2a3….an"(n≥0)
其中S为串名,n为串长度,代表字符串有n个字符,字符可以是数字、字母或其它ASCII字符,字符串用一对双引号包含,双引号本身不属于串,仅作为标识。
高级语言对字符串的操作进行了一定程度的封装。比如:赋值、求串长、串合并、插入、删除、替换、定位等。下面写几个例子。
1):字符串用事先给定的字母映射表进行加密,如:
a b c d e f g h i j k l m n o t y
q w e r t y u i o p a s d f g h j
按以上的对应关系,原字符串yamat 后的串应该是:jqdqh
如代码所示:
var list = "abcdefghijklmnoty"; var keys = "qwertyuiopasdfghj"; string str = "yamat"; var strKeys = ""; for (int j = 0; j < str.Length; j++) { if (list.Contains(str[j])) strKeys += keys.Substring(list.IndexOf(str[j]), 1); } Console.WriteLine(strKeys); Console.ReadLine();
2:字符串的存储
计算机的编址方式决定CPU访问存储器的存储单位大小,通常有两种存取方法,一种按字节编址(以字节为存取单位)和按字编址(以字为存取单位)。按字节的方式由于一个字符占用一个字节,因此,字符串中相邻的字符都是顺序存放在相邻的字节中,这样既节约空间,处理又方便,如图:
当计算机按字节为单位编址时,一个存储单元刚好存放一个字符,字符串中相邻的字符顺序存储在地址相邻的存储单元中;当计算机以字为单位编址时,一个存储单元由若干个字节组成。这时,顺序存储有紧凑格式和非紧凑格式两种存储方式。
1:紧凑型
紧凑型在存储单元中尽量多存储字符,例如:假设计算机的字长为32位,既4B,s=yamat computer,存储结构如图:
2:非紧凑型
非紧凑型是一个存储单元只存放一个字符,存储中多余的空间不用。如图:
优缺点刚好和紧凑型相反,实际运用中具体情况而定。
因为net中string默认最大为2G,所以一般情况不会出现溢出的情况。
3:字符串的匹配
字符串的匹配最原始的算法是BF(Brute-Force)算法,其思想是:从目标字符串的第一个字符开始和模式串的第一个字符进行匹配,若相同,则依次比较后续,否则从目标字符串第二个字符重新开始匹配,重复此过程。
假设目标字符串s="yamatamain",模式串t="ai"。C语言实现的算法如下:
int BF(string *s,string *t) { int i,j; i=j=0; while((i<s->len)&&(j<t->len)) { if(s->data[i]==t->data[j]) { i++;j++; } else { i=i-j+1;j=0; } } if(j>=t->len) return(i-t->len); else return 0; }
最好的情况下,每次都不成功的匹配都是t的第一个字符和中相应字符比较时不同,此时的总共比较次数为i-1+m,要匹配成功,s的开始位置只能是1~n-m+1。再假设在这n-m+1个开始位置上,匹配成功的概率是一样的,因此最好的情况下该算法的平均时间复杂度为O(n+m).
最坏的情况下,第i次成功,前面i-1都不成功,每趟比较m次,第i次成功也比较了m次,所以工比较i*m次,平均次数为:m(n-m+2)/2。因为n永远大于m,所以最坏情况下,时间复杂度为O(n*m)。
本文转自:http://www.cnblogs.com/YamatAmain/archive/2013/05/15/3080793.html