对串的学习

今天对串进行了简单的学习,把一些我觉得重要的东西写一写。


串的index操作

index(S, T, pos):
串S和串T存在,T是非空串, 1 <=pos<=StrLength(S)
若主串中含有和T相同的子串, 则返回它在主串S中第一次出现的位置, 否则返回0。

int Index(String S,, String T, int pos)  
{  
int n, m, i;  
String sub;  
if (pos > 0)  
{
    n = StrLength(S);
    m = StrLength(T);
    i  = pos;
    while(i <= n-m+1)
    {
        SubString(sub, S, i, m);/* 取主串第i个位置,长度为T的子串给sub*/
        if(StrCompare(sub, T) != 0)
            ++i;
        else
        return i;
    }
}
    return 0;
}

串的模式匹配-KMP算法

KMP算法是利用了串的前缀和后缀来减少没必要的回溯,举个例子:

主串:abcabxabx
子串:abcabc
当子串c与主串x不匹配但是c前面和x前面都拥有后缀ab与前缀ab, 所以下一次用子串的前缀ab匹配主串的后缀ab即可,这样就可以大大减少回溯,节省时间。

其实就是算出next[j]数组的值问题就解决了
算法如下(神奇的五行代码)

int GetNext(char ch[],int cLen,int next[]) {
next[1] = 0;
int i = 1,j = 0;
while(i<=cLen){
    if(j==0||ch[i]==ch[j]) next[++i] = ++j;
    else j = next[j];
}

}
看这个视频挺好
https://www.bilibili.com/video/av3246487/

动态多维数组

1.动态多维数组的创建

动态多维数组的创建可以节约空间, 避免不必要的空间浪费。
例子:
用C语言创建一个二维数组

// 用数组指针
//方法一
char (*a)[N];//指向一个含有N个元素的一维数组的指针
a = (char (*)[N])malloc(sizeof(char [N]) * m); // 给指针扩容
free(a);

//方法二
char **a;
a = (char**)malloc(sizeof(char*) * m);
for(int i = 0; i < m; i++)
    a[i] = (char*)malloc(sizeof(int*)*N)
for(int j = 0; j < m; j++)
    free(a[i]);
free(a);

方法三
char **a;
a = (char**)malloc(sizeof(char*) * m);
a[0] = (char*)malloc(sizeof(char) * m * n) // 一次性开辟所有空间
for(int i = 1; i < m; i++)
    a[i] = a[i - 1] + n;
free(a[0]);
free(a);

//运用指针数组
//方法一
char* a[M];
for(int i = 0; i < M; i++)
    a[i] = malloc(sizeof(char) * n);
for(int i = 0; i < M; i++)
    free(a[i]);
//方法二
char* a[M];
a[0] = (char*)malloc(sizeof(char) * M * n);
for(int i = 1; i < M; i++)
    a[i] = a[i - 1] + n;
free(a[0]);

用C++

//方法一
char (*a)[N];
a = new char[m][N];
delete[] a;
//方法二
cin >> n;
int **a = NULL;
a = new int*[n];
for (int i = 0; i < n; i++)
    a[i] = new int[4];
for(int i = 0; i < n; i++)
    delete[] a[i];
delete[] a;
//指针数组的内存分配和释放  
//方法一  
char **a;  
a = new char* [m];  
a[0] = new char[m * n];//一次性分配所有空间  
for(int i=1; i<m; i++)  
    a[i] = a[i-1] + n;//分配每个指针所指向的数组  

delete[] a[0];  
delete[] a;   

//方法二  
char* a[M];//指针的数组  
for(int i=0; i<M; i++)  
   a[i] = new char[n];  

for(i=0; i<M; i++)  
       delete[] a[i];   

//方法三  
char* a[M];//指针的数组  
a[0] = new char[M*n];  
for(int i=1; i<M; i++)  
    a[i] = a[i-1] + n;  

delete[] a[0];  

如果是三维、四维和二维一样也就一层一层的创建,把房间一个一个填满东西就行。

第三篇憨憨博客

今天要带给大家的是几个我用pygame写的一些的小游戏(pygame很好上手,建议大家很闲的话可以试试,做做小游戏)

好了废话不多说我们开始吧:

MolEXd.th.jpg

这是github 上窗口的链接:https://github.com/stupid-hentai-boy/My_Code

打开 点击FINGER_BOARD 复制代码到python上运行即可

运行效果如下:
MoQ3e1.md.png

玩该游戏需要玩家对吉他指板比较熟悉、看得懂音阶。每隔5秒音阶会刷新,你需要在这段时间内将这个音阶在吉他指板上找出来(每个位置都找到, 用鼠标点击即可)。 一共有21组, 21组结束后游戏会从新开始,你可以按Ese退出游戏,按空格键暂停游戏(游戏暂停时按Ese没用).

第二篇憨憨博客 -- 多数据输入

这是我的第二篇博客,为什么我要写这第二篇博客呢, 是因为一次数据结构的作业, 那是一个多数据输入的题目, 我提交了很多次都有错误,
第一个错误是语法问题, 我们学校的online judge系统并不支持for(int i = 0;;)这样的写法, 而我的virtual studio就支持(难受啊),第二个错误是scanf(), 在vs中用的是scanf_s()而不是scanf()(这个函数本生有一定的溢出危险), 所以导致我编译不能, 第三个错误就是我今天要讲的重点,就是多数据输入:

事情是这样的oj上的它将要输入的数值从事先写好的文件中提取出来,scanf()一个一个的读取,平时scanf()的返回值是成功读取数据的个数, 但一旦读到文件的末尾 scanf()将返回EOF(也就是end of file)所以可以这么写

1.while(scanf(“%d”, &n) != EOF)
2.C++中while(cin >> n)
3.while(~scanf(“%d”, &n))

希望对大家有所
帮助 谢谢