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(<逗号分隔的参数>)
其中参数序号表示要对“逗号分隔的参数”中相应位置的参数进行格式化