当前位置: 首页> 游戏> 评测 > 杭州seo托管公司推荐_网络工程可以从事什么工作_网络营销软件推广_百度推广后台登陆

杭州seo托管公司推荐_网络工程可以从事什么工作_网络营销软件推广_百度推广后台登陆

时间:2025/8/13 20:54:58来源:https://blog.csdn.net/m0_45426637/article/details/147032548 浏览次数:0次
杭州seo托管公司推荐_网络工程可以从事什么工作_网络营销软件推广_百度推广后台登陆

目录标题

    • 串的定义
    • 顺序串的实现
        • 初始化
        • 赋值
        • 打印串
        • 求串的长度
        • 复制串
        • 判断两个串长度是否相等
        • 连接两个串
        • 比较两个串内容是否相等
        • 插入操作
        • 删除操作
        • 调试与代码合集
    • 串的模式匹配算法
      • 朴素的模式匹配算法
      • KMP算法实现模式匹配

串的定义

  • 定义:由0个或多个字符组成的有限序列,由一对双引号引起来。记为"S"

顺序串的实现

初始化
    def __init__(self):"""串初始化"""self.str = list()self.length = ()
赋值
    def strAssign(self, string):"""赋值:param string: 待赋值的串:return:"""# 计算串的长度length = len(string)# 赋值self.str = list()for i in range(length):self.str.append(string[i])# 设置串的长度self.length = length
打印串
    def display(self):"""打印:return:"""print('当前串的长度:', end='')for i in range(self.length):print(self.str[i], end='')print()
求串的长度
    def getLength(self):"""求串的长度:return: 串的长度"""return self.length
复制串
    def strCopy(self, string):"""复制串:param string: 待复制的串:return:"""# 将当前串初始化self.str = list()# 循环复制for char in string.str:self.str.append(char)# 设置当前串的长度self.length = string.getLength()
判断两个串长度是否相等
    def strEquals(self, string):"""判断两个串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循环,逐一比较for i in range(self.length):if self.str[i] != string.str[i]:break# 判断,如果i等于串的长度,则相等:否则不相等i += 1if i == self.length:return Trueelse:return Falseelse:return False
连接两个串
    def strConnect(self, string2):"""连接两个串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循环for i in range(self.length):newString.str.append(self.str[i])# 循环for i in range(string2.getLength()):newString.str.append(string2.str[i])# 设置串的长度newString.length = self.length + string2.getLength()return newString
比较两个串内容是否相等
    def strCompete(self, string):"""两个串比较大小:param string: 带比较大小的串:return: 1为大于,0为等于,-1为小于"""# 循环,逐个比较两个串相应位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判断两个串是否还有字符,还存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0
插入操作
    def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判断位置是否正确if offset < 0 or offset > self.length:print("插入位置不合法!")return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将待插入的串存入当前串for i in range(string.getLength()):self.str.append(string.str[i])# 将目标串剩余字符存入当前串for i in range(offset, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length + string.getLength()
删除操作
    def delete(self, offset, len):"""删除:param offset: 删除开始位置:param len: 删除长度:return:"""# 判断位置与长度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('删除位置不合法!')return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将目标串剩余的字符存入当前串for i in range(offset + len, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length - len
调试与代码合集
class String:"""串的定义"""def __init__(self):"""串初始化"""self.str = list()self.length = ()def strAssign(self, string):"""赋值:param string: 待赋值的串:return:"""# 计算串的长度length = len(string)# 赋值self.str = list()for i in range(length):self.str.append(string[i])# 设置串的长度self.length = lengthdef display(self):"""打印:return:"""print('当前串的长度:', end='')for i in range(self.length):print(self.str[i], end='')print()def getLength(self):"""求串的长度:return: 串的长度"""return self.lengthdef strCopy(self, string):"""复制串:param string: 待复制的串:return:"""# 将当前串初始化self.str = list()# 循环复制for char in string.str:self.str.append(char)# 设置当前串的长度self.length = string.getLength()def strEquals(self, string):"""判断两个串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循环,逐一比较for i in range(self.length):if self.str[i] != string.str[i]:break# 判断,如果i等于串的长度,则相等:否则不相等i += 1if i == self.length:return Trueelse:return Falseelse:return Falsedef strConnect(self, string2):"""连接两个串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循环for i in range(self.length):newString.str.append(self.str[i])# 循环for i in range(string2.getLength()):newString.str.append(string2.str[i])# 设置串的长度newString.length = self.length + string2.getLength()return newStringdef strCompete(self, string):"""两个串比较大小:param string: 带比较大小的串:return: 1为大于,0为等于,-1为小于"""# 循环,逐个比较两个串相应位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判断两个串是否还有字符,还存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判断位置是否正确if offset < 0 or offset > self.length:print("插入位置不合法!")return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将待插入的串存入当前串for i in range(string.getLength()):self.str.append(string.str[i])# 将目标串剩余字符存入当前串for i in range(offset, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length + string.getLength()def delete(self, offset, len):"""删除:param offset: 删除开始位置:param len: 删除长度:return:"""# 判断位置与长度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('删除位置不合法!')return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将目标串剩余的字符存入当前串for i in range(offset + len, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length - lenif __name__ == '__main__':# 16.串string1 = String()str = input('请输入你的第1个串的内容:')string1.strAssign(str)string1.display()print(f"当前string1串的长度为:{string1.getLength()}")# 复制string2 = String()str = input('请输入你的第2个串的内容:')string2.strAssign(str)string2.display()print(f"当前string2串的长度为:{string2.getLength()}")# string1.strCopy(string2)string1.display()print(f"当前string1串的长度为:{string1.getLength()}")# 判断是否相等串result = string1.strEquals(string2)if result:print('两个串相等')else:print('两个串不相等')# 连接两个串string3 = string1.strConnect(string2)string3.display()print(f"当前string3串的长度为:{string3.length}")# 两个串比较大小result = string1.strCompete(string2)if result == 1:print('string1 大于 string2')elif result == -1:print("string1 小于 string2")else:print('string1 等于 string2')# 插入string1.insert(3, string2)string1.display()print(f"当前string1的长度为:{string1.length}")# 删除string1.delete(3, 2)string1.display()print(f"当前string1的长度为:{string1.length}")

串的模式匹配算法

朴素的模式匹配算法

  • 核心思路
    • 也称为暴力搜索算法。
    • 从目标串S的第一个字符开始与模式串P的第一个字符进行匹配
    • 如果匹配,继续逐个匹配后续字符,
    • 如果不匹配,模式串P返回到第一个字符,与目标串S的第二个字符进行匹配,
    • 如果匹配,继续逐个匹配后续字符,
    • 如果不匹配,模式串P返回到第一个字符,与目标串S的第三个字符进行匹配,
    • 以此类推…
  • 最好情况:从第一个字符开始就匹配成功,模式串数量m,则时间复杂度为O(m)
  • 最坏情况:没有匹配成功,每次匹配比较m次,共匹配n-m+1次,时间复杂度为O(n×m).
  • 代码实现
def bruteForce(string1, string2):"""暴力模式匹配:param string2::return:"""i = 0j = 0while i < len(string1) and j < len(string2):if string1[i] == string2[j]:j += 1i += 1else:i = i-j+1j = 0# 如果找到返回索引if j == len(string2):index = i - len(string2)# 否则返回-1else:index = -1return indexif __name__ == '__main__':string1 = "ababdabcd"string2 = "abc"print(bruteForce(string1, string2) + 1)

KMP算法实现模式匹配

  • 核心思路
    • next列表的设计与生成。

    • 使用前后缀列表的方式去解析next值的设定

    • 其中:

      • 前缀列表表示除去最后一个字符后的前面所有子串组成的集合;
      • 后缀列表表示除去第一个字符后的后面所有子串组成的集合。
    • 以“abcabd”为例,求的next列表

    • 1.串‘a’的前缀和后缀均为空集,最长共有元素长度为0,

    • 2.串“ab”的前缀为{“a”},后缀集合为{‘b’},没有相同的前后缀的子串,最长共有元素长度为0,

    • 3.串“abc”的前缀集合为{“a”,“ab”},后缀为{“c”,“bc”},没有相同的前后缀的子串,最长共有元素长度为0,

    • 4.串“abca”的前缀集合为{“a”,“ab”,“abc”},后缀为{“a”,“ca”,“bca”},相同的前后缀子串为“a”,最长共有元素长度为1,

    • 5.串“abcab”的前缀集合为{“a”,“ab”,“abc”,“abca”},后缀为{“b”,“ab”,“cab”,“bcab”},相同的前后缀子串为“ab”,最长共有元素长度为2,

    • 6.串“abcabd”的前缀集合为{“a”,“ab”,“abc”,“abca”,“abcab”},后缀为{“d”,“bd”,“abd”,“cabd”,“bcabd”},没有相同的前后缀子串,最长共有元素长度为0,

    • 7.最后得出字符串“abcabd”的next列表为[-1,0,0,0,1,2].

  • 代码实现
def createNext(pattern):length = len(pattern)# 定义next列表next = [0 for _ in range(len(pattern))]next[0] = -1next[1] = 0# 计算next列表k = -1j = 0while j < length-1:if pattern[k] == pattern[j] or k == -1:j += 1k += 1next[j] = kelse:k = next[k]print(next)return nextdef kmpSearch(text, pattern):# 得到next列表next = createNext(pattern)# 匹配字符串i = 0j = 0while i < len(text) and j < len(pattern):if text[i] == pattern[j] or j == -1:i += 1j += 1else:j = next[j]if j >= len(pattern):return Trueelse:return Falseif __name__ == '__main__':text = "ababdabcabcabd"pattern = "abcabd"print(kmpSearch(text, pattern))
关键字:杭州seo托管公司推荐_网络工程可以从事什么工作_网络营销软件推广_百度推广后台登陆

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: