串和数组

串:

在应用程序中使用最频繁的类型是字符串。字符串简称串,是一种特殊的线性表,其特殊性在于串中的数据元素是一个个的字符。字符串在计算机的许多方面应用很广。如在汇编和高级语言的编译程序中,源程序和目标程序都是字符串数据。在事务处理程序中,顾客的信息如姓名、地址等及货物的名称、产地和规格等,都被作为字符串来处理。另外,字符串还具有自身的一些特性。因此,把字符串作为一种数据结构来研究。

串的基本概念:

串(String)由 n(n≥0)字符组成的有限序列。一般记为:
S=”c1c2…cn” (n≥0)
其中, S是串名,双引号作为串的定界符,用双引号引起来的字符序列是串值。 ci( 1≤i≤n)可以是字母、数字或其它字符, n为串的长度,当n=0 时,称为空串(Empty String)。
串中任意个连续的字符组成的子序列称为该串的子串(Substring)。包含子串的串相应地称为主串。子串的第一个字符在主串中的位置叫子串的位置。如串s1”abcdefg”,它的长度是 7,串s2”cdef”的长度是 4, s2是s1的子串, s2的位置是 3。
如果两个串的长度相等并且对应位置的字符都相等,则称这两个串相等。而在 C#中,比较两个串是否相等还要看串的语言文化等信息。

串的存储和代码实现:

由于串中的字符都是连续存储的,而在 C#中串具有恒定不变的特性,即字符串一经创建,就不能将其变长、变短或者改变其中任何的字符。所以,这里不讨论串的链式存储,也不用接口来表示串的操作。同样,把串看作是一个类,类名为 StringDS。取名为 StringDS 是为了和 C#自身的字符串类 String 相区别。类StringDS 只有一个字段,即存放串中字符序列的数组 data。由于串的运算有很多,类 StringDS 中只包含部分基本的运算。串类 StringDS中的方法和属性:

//索引器
    public char this[int index]
//求串长
public int GetLength()
//串比较
public int Compare(StringDS s)
//求子串
public StringDS SubString(int index, int len)
//串连接
public StringDS Concat(StringDS s)
//串插入
public StringDS Insert(int index, StringDS s)
//串删除
public StringDS Delete(int index, int len)
//串定位
public int Index(StringDS s)

C#中的串:

在 C#中,一个 String 表示一个恒定不变的字符序列集合。 String 类型是封闭类型,所以,它不能被其它类继承,而它直接继承自 object。因此, String 是引用类型,不是值类型,在托管堆上而不是在线程的堆栈上分配空间。 String 类型还 继 承 了 IComparable 、 ICloneable 、 IConvertible 、 IComparable<string> 、IEnumerable<char>、 IEnumerable 和 IEquatable<string>等接口。 String 的恒定性指的是一个串一旦被创建,就不能将其变长、变短或者改变其中任何的字符。所以,当我们对一个串进行操作时,不能改变字符串,如在本书定义的 StringDS 类中,串连接、串插入和串删除等操作的结果都是生成了新串而没有改变原串。 C#也提供了 StringBuilder 类型来支持高效地动态创建字符串。
在 C#中,创建串不能用 new 操作符,而是使用一种称为字符串驻留的机制。

这是因为 C#语言将 String 看作是基元类型。基元类型是被编译器直接支持的类型,可以在源代码中用文本常量(Literal)来直接表达字符串。当 C#编译器对源代码进行编译时,将文本常量字符串存放在托管模块的元数据中。而当 CLR 初始化时, CLR 创建一个空的散列表,其中的键是字符串,值为指向托管堆中字符串对象的引用。散列表就是哈希表。当 JIT编译器编译方法时,它会在散列表中查找每一个文本常量字符串。如果找不到,就会在托管堆中构造一个新的 String 对象(指向字符串),然后将该字符串和指向该字符串对象的引用添加到散列表中;如果找到了,不会执行任何操作。

c#中的数组:

数组是一种常用的数据结构,可以看作是线性表的推广。数组作为一种数据结构,其特点是结构中的数据元素可以是具有某种结构的数据,甚至可以是数组,但属于同一数据类型。数组在许多高级语言里面都被作为固定类型来使用。
数组是 n(n≥1)个相同数据类型的数据元素的有限序列。一维数组可以看作是一个线性表,二维数组可以看作是“数据元素是一维数组”的一维数组,三维数组可以看作是“数据元素是二维数组”的一维数组,依次类推。
C#支持一维数组、多维数组及交错数组(数组的数组)。所有的数组类型都隐含继承自 System.Array。Array 是一个抽象类,本身又继承自 System.Object。所以,数组总是在托管堆上分配空间,是引用类型。任何数组变量包含的是一个指向数组的引用,而非数组本身。当数组中的元素的值类型时,该类型所需的内存空间也作为数组的一部分而分配;当数组的元素是引用类型时,数组包含是只是引用。

Array类中的常用方法:

using System;
using System.Collections;
public abstract class Array : ICloneable, IList, ICollection, IEnumerable
{
//判断 Array 是否具有固定大小。
    public bool IsFixedSize { get; }
//获取 Array 元素的个数。
    public int Length { get; }
//获取 Array 的秩(维数)。
    public int Rank { get; }
//实现的 IComparable 接口,在.Array 中搜索特定元素。
    public static int BinarySearch(Array array, object value);
//实现的 IComparable<T>泛型接口,在 Array 中搜索特定元素。
    public static int BinarySearch<T>(T[] array, T value);
//实现 IComparable 接口,在 Array 的某个范围中搜索值。
    public static int BinarySearch(Array array, int index,
        int length, object value);
//实现的 IComparable<T>泛型接口,在 Array 中搜索值。
    public static int BinarySearch<T>(T[] array,
        int index, int length, T value);

//Array 设置为零、 false 或 null,具体取决于元素类型。
    public static void Clear(Array array, int index, int length);
//System.Array 的浅表副本。

    public object Clone();
//从第一个元素开始复制 Array 中的一系列元素
//到另一 Array 中(从第一个元素开始)。
    public static void Copy(Array sourceArray,
        Array destinationArray, int length);

//将一维 Array 的所有元素复制到指定的一维 Array 中。
    public void CopyTo(Array array, int index);
//创建使用从零开始的索引、具有指定 Type 和维长的多维 Array。
    public static Array CreateInstance(Type elementType,
        params int[] lengths);

//返回 ArrayIEnumerator。
    public IEnumerator GetEnumerator();
//获取 Array 指定维中的元素数。
    public int GetLength(int dimension);
//获取一维 Array 中指定位置的值。
    public object GetValue(int index);
//返回整个一维 Array 中第一个匹配项的索引。
    public static int IndexOf(Array array, object value);
//返回整个.Array 中第一个匹配项的索引。
    public static int IndexOf<T>(T[] array, T value);
//返回整个一维 Array 中最后一个匹配项的索引。
    public static int LastIndexOf(Array array, object value);
//反转整个一维 Array 中元素的顺序。
    public static void Reverse(Array array);
//设置给一维 Array 中指定位置的元素。
    public void SetValue(object value, int index);
//对整个一维 Array 中的元素进行排序。
    public static void Sort(Array array);
}

练习题:

1 设 s=”I am a teacher”,i=”excellent”,r=”student”。用 StringDs类中的方法求:
( 1) 串 s、i、r 的长度;
( 2) S.SubString(8, 7)、i.SubString(2, 1);
( 3) S.IndexOf(“tea”)、i.IndexOf(“cell”)、r.IndexOf(“den”)。
2 串的替换操作是指:已知串 s、t、r,用 r 替换 s 中出现的所有与 t 相等的子串。写出算法,方法名为 Replace。

3 已知下列字符串:
a=”THIS”,f=”A SMPLE” c=”GOOD”,d=”NE”,b=”︼”,g=”IS”,
s=a.Concat(b.Concat(a.SubString(3,2)).(f.SubString(2,7))),
t=f.Replace(f.SubString(3,6),c),
u=c.SubString(3,1).Concat(d),
v=s.Concat(b.Concat(t.ConCat(b.Concat(u))))。
问 s,t,v,GetLength(s),v.IndexOf(g),u.IndexOf(g)各是什么。

4 设已知两个串为:
S1=”bc cad cabcadf”,S2=”abc”。试求两个串的长度,并判断 S2 串是否是 S1 串的子串,如果 S2 是 S1 的子串,指出 S2 在 S1 中的起始位置。

5 已知:s=”(XYZ)+*”,t=”(X+Z)*Y”,试利用连接、求子串和替换等基本运算,将 s 转化为 t。
时间: 2024-02-02 14:03:05

串和数组的相关文章

总结:串和数组的学习

总结一下我在学习串和数组的过程中遇到的几个问题: 学习了strstr函数并明白了它的原理,(这个真的很好用 学习了strcat函数,即字符串之间的连接函数,(这个也非常实用 学习了KMP算法,这个是最花时间,最需要集中注意力去学的,稍不注意就看不明白了,但这个算法是比strstr要快很多的,可以说KMP可以做的未必strstr可以做,而strstr能做到KMP都能做. 做到字符串哈希的时候还去学习了map函数,忽然感觉C++果然好强大啊,什么qsort,cmp都特别好用 复习了结构体数组的一些问

第四章_串、数组和广义表_学习小结

串.数组和广义表 广义表被鸽了,暂时就不提它,总结一下串和数组的心得. 串 串本身不难,好比字符数组,都是我们所熟悉的.难得是与其相关的算法,例如KMP算法. 对于KMP算法,难点在于next数组的取得与使用. 点击跳转:基于KMP算法的字符匹配问题 以上是个人的一些见解,当然是参考别人的博客之后的.... 数组 至于数组,这里主要研究二维数组的应用,比如用三元组表压缩存储. 由于书里连ADT都没有,只能自己摸索着定义了....(还不是为了PTA的题目QAQ)所以就稍微详细说一下 例:用三元组表

数据结构与算法(C#)入门 --- 串和数组

前言 本章内容包含串与数组,都是平时工作中常用的内容.因此串与数组的介绍会很简单,重点在于 LeetCode 的练习. 串的定义 在应用程序中使用最频繁的类型是字符串.字符串简称串. 串的存储 由于串中的字符都是连续存储的,而在 C#中串具有恒定不变的特性,即字符串一经创建,就不能将其变长.变短或者改变其中任何的字符. 数组 数组是一种常用的数据结构,可以看作是线性表的推广.数组作为一种数据结构,其特点是结构中的数据元素可以是具有某种结构的数据. 比如二维数组的元素就是一维数组. 数组的存储 在

POJ 1159-Palindrome(dp_回文串+滚动数组)

Palindrome Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to wr

数据结构(C语言版)-第4章 串、数组和广义表

补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from)串连接,strcat(char to,char from) 求串长,strlen(char s) 4.1  串 串(String)----零个或多个字符组成的有限序列 串的存储结构:顺序存储.链式存储 顺序存储表示 typedef struct{ char *ch; //若串非空,则按串长分配存储区,

第四章 串和数组 (主要kmp算法)

第四章 题目:串的模式匹配 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. (用KMP算法,就是不用再回溯, 最前面的k个字符和j之前的最后k个字符是一样的:P[1~ k] == P[j-k ~ j-1]) 1.先定义一个串的顺序存储结构,因为不需要出插入和删除操作,所以选用了顺序存储 typedef struct { char ch[maxlen + 2]; int length

[bzoj 3676][uoj #103]【APIO2014】Palindromes回文串 后缀数组+manachar

给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度. 对于给你的这个字符串 ss,求所有回文子串中的最大存在值. 输入格式 一行,一个由小写拉丁字母(a~z)组成的非空字符串 ss. 输出格式 输出一个整数,表示所有回文子串中的最大存在值. 样例一 input abacaba output 7 explanation 用 ∣s∣∣s∣ 表示字符串 ss 的长度. 一个字符串 s1s2-s∣s∣s1s2-s∣s∣ 的子串是

数据结构 第4章 串、数组和广义表 单元小结(1)重点 BF算法

BF算法 考试必考 !!!!!背下来!!!! int lndex_BF(string s,string t,int pos) {//返回模式t在主串s中第pos个字符开始第一次出现的位置下标 //若不存在,则返回值为-1 //其中,t非空,1<=pos<=StrLength(s) int i,j; i = pos-1;//下标 j = 0;//下标 while(i<s.length()&&j<t.length()){ if(s[i] == t[j]) { ++i;

[POI2000]公共串 - 后缀数组

Description 求若干个串的最长的公共子串的长度. Solution 考虑将这若干个串全部拼起来,中间用一些不在字符集内的符号隔开. 然后二分答案 \(K\),如果连续的一段 \(height\) 都大于等于 \(K\),且每个串都出现了至少一次,则是可行的. Code #include <bits/stdc++.h> using namespace std; const int _ = 1e5 + 10; int N, n, s[_], belong[_]; int rnk[_],