DAY9 字符串02

KMP

KMP算法是一个快速查找匹配串的算法,解决字符串匹配问题。
首先定义问题:假设字符串str长度为N,字符串match长度为M,M<=N,想确定str中是否有某个子串是等于match的。
首先要理解next信息,即前缀串与后缀串的最长匹配长度信息。对于任意字符串s1,求助任意i位置的信息,就是求取i往前的字符串(记作s2),其前缀串和后缀串的最长匹配长度,并且前缀串和后缀串不能覆盖到s2整体。

28. 实现 strStr()

不会!改天看!!没看懂、!!

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        # haystack 字符串 needle 匹配串
        a = len(needle)
        b = len(haystack)
        if a == 0: return 0
        next = self.getnext(a,needle)
        p=-1
        for j in range(b):
            while p>=0 and needle[p+1]!=haystack[j]:
                p=next[p]
            if needle[p+1]==haystack[j]:
                p+=1
            if p==a-1:
                return j-a+1
        return -1
    # 构建next数组
    def getnext(self,a,needle):
        next = ['' for i in range(a)]
        k = -1
        next[0] = k
        for i in range(1,len(needle)):
            while k>-1 and needle[k+1]!=needle[i]:
                k=next[k]
            if needle[k+1]==needle[i]:
                k+=1
            next[i]=k
        return next
        # for i in range(1,len(needle)):
            # while 

459.重复的子字符串

  • 第一种思路,若s中不含重复的子串,那么s本身就相当于这样的一个子串。那么在t=s+s字符串中,对t掐头去尾后就不存在s了。

PYTHON

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        if s in (s+s)[1:-1]:
            return True
        else:
            return False

C++

t.erase(t.begin()); t.erase(t.end()-1);从字符串中删除了第一个和最后一个字符,有效地从中删除了原始字符串的第一个和最后一个字符。这样做的原因是删除 开头和结尾存在的任何潜在全字符串匹配项。
if (t.find(s) != std::string::npos) return true;检查修改后的字符串中是否存在原始字符串。

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string t = s + s;
        t.erase(t.begin()); t.erase(t.end()-1); //掐头去尾
        if (t.find(s) != std::string::npos) return true; //r
        return false;
    }
};

字符串总结

PYTHON

字符串切片

字符串可以通过方括号[]运算来获取相应索引位置的字符。切片共有三个参数string[para1:para2:para3],其中para1表示切片的开始位置,默认为0,para2表示切片截止位置(但不包含该位置,默认为字符串长度),para3表示切片的步长(默认为1)。第三个参数一般可以忽略。

常用字符串方法

代码作用
str.strip()删除开头结尾两边的所有空白(不删除中间)若只要删除开头/结尾一边的则使用str.lstrip()/str.rstrip()
str.upper()全部大写
str.lower全部小写
str.title()所有单词仅首字母大写
str.count(a)返回某字符 a 在 str 中出现次数
str.find(a)返回某字符 a 在 str 中的索引值,若 a 不在 str 中则返回 -1
str.index(a)返回某字符 a 在 str 中的索引值,若 a 不在 str 中则报错
a.join(s)以指定字符串 a 作为分隔符,分隔开 s 中所有元素并合并为一个新的字符串,s 可以为字符串或列表等,注意 join 仅接受字符串值!
str.split(a)以指定分割符 a 分割字符串,返回列表类型
str.startswith(a, beg = 0,end = len(str))检查字符串是否以 a 开头,是则返回true,否则返回false。如果beg和end指定值,则在指定范围内检查
str.isdigit() or str.isnumeric()如果字符串只包含数字,则返回 True
str.isalpha()如果字符串至少有一个字符,且都是字母,则返回 True
str.isalnum()如果字符串至少有一个字符,且都是字母或者数字,则返回 True

常用字符串函数

函数功能
ord(str)将字符转换为对应的ASCII值
chr(str)将ASCII值转换为对应的字符
len(str)返回字符串长度
max(str)返回字符串中最大的字符
min(str)返回字符串中最小的字符

字符串格式化

通用格式

{<参数序号>:<格式控制标记>}.format(<逗号分隔的参数>)
其中参数序号表示要对“逗号分隔的参数”中相应位置的参数进行格式化

C++

双指针回顾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值