数据结构与算法-字符串(Python)(五)

概述:

字符串(string)简称串,也是一种线性结构。在python中和array差不多,因为py的数组也可以包括各种字符(在C/Java一类的语法中,数组必须是同一种数据类型的元素)。线性结构,有限序列,是主要特点。串其中可以包含各种元素,也是计算机主要处理的一类对象。因此,串的题目涉及的范围很广,可以结合其他算法出题,往往比较有难度。通常,动态规划,双指针,回溯和栈是很重要的工具。

串的存储结构:

其存储结构同线性表一样,也分为顺序存储,即各个字符依次存放在连续的存储单元,以及链式存储,同链表一样,特点是,一个结点可以存储多个字符(一个字符占8位),称为结点的大小,结点大小越大存储密度越大,越小运算处理(插入/删除等)越方便。

串的基本的实现操作包括:赋值,复制,判断相等,串长,串连接,求子串,插入,删除,替换,输出。

串的基本算法:

循环左移

问题描述:给定一个字符串S[0…N-1],要求把S的前k个字符移到S的尾部,如把S的字符串“abcded"前面的前两个字符“a”,“b”移到字符串的尾部,得到新字符串“cdefab”,即字符串循环左移k位。算法要求:时间复杂度为O(n),空间复杂度为O(1)。

暴力移位法,简单粗暴,我们当然不考虑了,时间复杂度为O(KN),空间复杂度为O(1);

三次拷贝法,新建一个数组,分三次拷贝,时间复杂度为O(N),空间复杂度为O(K);

三次翻转法,类似于矩阵转置,设X=‘ab’, Y='cdef ',X ’ = ‘ba’, Y ’ = ’ fedc ’ , ( X ’ Y ’ ) ’ = ’ cdefab ’ ,时间复杂度为O(n),空间复杂度为O(1)。

def leftshift(string:str, m:int)-> str:
    n = len(string)
    m %= n
    left = string[:m]
    right = string[m+1:]
    left = left[::-1]
    right = right[::-1]
    result = left + right
    result = result[::-1]
 
    return result

字符串查找(模式匹配)

暴力匹配法跳过,我们讨论著名的KMP算法(Knuth-Morris-Pratt算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

设主串(下文中我们称作T)为:a b a c a a b a c a b a c a b a a b b
模式串(下文中我们称作W)为:a b a c a b

设主串(下文中我们称作T)为:a b a c a a b a c a b a c a b a a b b

模式串(下文中我们称作W)为:a b a c a b

在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。
在这里插入图片描述

发布了44 篇原创文章 · 获赞 3 · 访问量 2606

猜你喜欢

转载自blog.csdn.net/xfxlesson/article/details/104335890