我们古人没有电影电视,没有游戏网络,所以文人们就会想出一些文字游戏来娱乐。比如宋代的李禺写了这样一首诗:“枯眼望遥山隔水,往来曾见几心知?壶空怕酌一杯酒,笔下难成和韵诗。途路阻人离别久,讯音无雁寄回迟。孤灯守夜长寥寂,夫忆妻兮父忆儿。”显然这是老公想念老婆和儿子的诗句。曾经和妻儿在一起,享受天伦之乐,现在一个人长久没有回家,也不见书信返回,望着油灯想念亲人,能不伤感吗? 可仔细一读发现,这首诗竟然可以倒过来读:“儿忆父兮妻忆夫,寂寥长夜守灯孤。迟回寄雁无音讯,久别离人阻路途。诗韵和成难下笔,酒杯一酌怕空壶。知心几见曾来往,水隔山遥望眼枯。”这表达了妻子对丈夫的思念。老公离开好久,路途遥远,难以相见。写信不知道写什么,独自喝酒也没什么兴致。只能和儿子夜夜守在家里一盏孤灯下,苦等老公的归来。 这种诗叫做回文诗。它是一种可以倒读或反复回旋阅读的诗体。刚才这首就是正读是丈夫思念妻子,倒读是妻子思念丈夫的古诗。是不是感觉很奇妙呢? 在英文单词中,同样有神奇的地方。“即使是lover也有个over,即使是friend也有个end,即使是believe也有个lie。”你会发现,本来不相干,甚至对立的两个词,却有某种神奇的联系。这可能是创造这几个单词的智者们也没有想到的问题。 今天我们就要来谈谈这些单词或句子组成字符串的相关问题。 1 串的定义与操作 1.1 串的相关定义 串(string)是由零个或多个字符组成的有限序列,又名字符串,记为S=”a0a1……an-1”。 串中包含字符的个数称为串的长度。 长度为零的串称为空串(null string)。直接用双引号””表示,在C#中也可用string.Empty来表示。 还有一些概念需要解释: 空白串:由一个或多个空格组成的串。 子串与主串:串中任意连续字符组成的子序列,称为该串的子串。相应的包含子串的串称为主串,即子串是主串的一部分。 子串在主串中的位置:子串在主串中第一次出现时,子串第一个字符在主串中的序号。 例如: A=“this is a string”; B=“is”; B在A中的位置为2。 串相等:长度相等且对应位字符相同。 1.2 串的操作 串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符。因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找一个元素,插入或删除一个元素,但串中更多的是关注它子串的应用问题,如查找子串位置,得到指定位置子串、替换子串等操作。 关于串的基本操作如下: (1)获取串的长度 (2)获取或设置指定索引处的字符 (3)在指定位置插入子串 (4)在指定位置移除给定长度的子串 (5)在指定位置取子串 (6)当前串的拷贝 (7)串连接 (8)串的匹配 (9)串替换 (10)移除串两边的空格 (11)串填充 比如C#中,字符串操作就还有ToLower转小写、ToUpper转大写、IndexOf从左查找子串位置、LastIndexOf从右查找子串位置、Trim去除两边空格等比较方便的操作,它们其实就是前面这些基本操作的扩展函数。 图1 串接口 代码见:LinearStruct.IString.cs 2 串的存储与实现 串的存储结构与线性表相同,分为两种: 顺序存储:char类型的数组。由于数组是定长的,就存在一个预定义的最大串长度,它规定在串值后面加一个不计入串长度的结束符,比如’\0’来表示串值的终结。 链式存储:SlinkList<char> (浪费存储空间) 图2 顺序串类图 代码见:LinearStruct.SeqString.cs 3 举例: using System; using LinearStruct; namespace ConsoleApplicationString { classProgram { privatestatic voidMain(string[] args) { string S = "teacherand student all like tea."; IString str = new SeqString(S); Console.WriteLine("原字符串:{0}", str); IString str2 = str; IString str3 = str.Clone(); str2[0] = 'm'; Console.WriteLine("没调用Clone方法:{0}", str); Console.WriteLine("调用Clone方法:{0}", str3); Console.WriteLine("----------"); str = new SeqString(S); IString str4 = newSeqString("mother"); Console.WriteLine(str.Insert(0, str4)); Console.WriteLine(str.Insert(3, str4)); Console.WriteLine(str.Remove(3, 2)); Console.WriteLine(str.Remove(3, 10)); Console.WriteLine("----------"); Console.WriteLine(str.Concat(str4)); Console.WriteLine((SeqString)str4 + (SeqString) str); Console.WriteLine("----------"); Console.WriteLine(str.SubString(3, 0)); Console.WriteLine(str.SubString(3, 4)); Console.WriteLine(str.SubString(3, 10)); Console.WriteLine("----------"); IString parS1 = newSeqString("ea"); IString parS2 = newSeqString("hk"); Console.WriteLine(str.IndexOf(parS1)); Console.WriteLine(str.IndexOf(parS1, 8)); Console.WriteLine(str.IndexOf(parS2)); Console.WriteLine("----------"); Console.WriteLine(str.PadLeft(40, '@')); Console.WriteLine("----------"); Console.WriteLine(str.Replace(new SeqString("ea"), newSeqString("EA"))); Console.WriteLine("----------"); Console.WriteLine(str.Concat(str4).Length); Console.WriteLine(str.Concat(str4).Trim().Length); } } } 通过微信学习的知识只能是碎片化的知识,作为新时代的我们希望能够构建自己的知识结构,使我们的知识体系化,系统化,以后在遇到碎片化的知识,我们做的只是融合到自己的知识结构中,故我们将推出“与LSGO一起学”系列课程,帮助大家来构建知识框架,初步规划有:
如果对这些内容感兴趣,可以一起来学习讨论。 我们的官网: www.lsgogroup.com
|
|