一、知识点介绍
1.字符串简介
混淆点:
子串、主串与子序列的概念
前缀与后缀的概念
2.字符串问题
1.字符串匹配问题
2.子串相关问题
3.前缀/后缀相关问题
4.回文串相关问题
5.子序列相关问题
3.字符串的比较
1.字符串的比较操作
2.字符串的字符编码
4.字符串的存储结构
顺序与链式存储
5.字符串匹配问题
单字符串匹配问题与多字符串匹配问题
6.单字符串朴素匹配算法(BF算法)和KMP匹配算法
next数组的构建思路与最长相同前后缀
二、例题(来源于力扣:https://leetcode-cn.com/)
1.验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
class Solution:
def isPalindrome(self, s: str) -> bool:
left=0
right=len(s)-1
while left<right:
if not s[left].isalnum():
left+=1
continue
if not s[right].isalnum():
right-=1
continue
if s[left].lower()==s[right].lower():
left+=1
right-=1
else:
return False
return True
2.翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
1.输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
2.翻转后单词间应当仅用一个空格分隔。
3.翻转后的字符串中不应包含额外的空格。
class Solution:
def reverseWords(self, s: str) -> str:
words=[]
cur=""
for ch in s:
if ch==' ':
if cur:
words.append(cur)
cur=""
else:
cur+=ch
if cur:
words.append(cur)
for i in range(len(words)//2):
words[i],words[len(words)-1-i]=words[len(words)-1-i],words[i]
return " ".join(words)
3.验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
class Solution:
def judge(self, s: str) -> bool:
left=0
right=len(s)-1
while left<right:
if s[left]==s[right]:
left+=1
right-=1
else:
return False
return True
def validPalindrome(self, s: str) -> bool:
if self.judge(s)==True:
return True
left=0
right=len(s)-1
while left<right:
if s[left]!=s[right]:
return self.judge(s[left+1:right+1]) or self.judge(s[left:right])
left+=1
right-=1
return True
4.Excel表列名称
给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
例如:
A -> 1
B -> 2
C -> 3
…
Z -> 26
AA -> 27
AB -> 28
…
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
cur=""
while columnNumber>26:
columnNumber-=1
cur+=chr(columnNumber%26+65)
columnNumber=columnNumber//26
cur+=chr(columnNumber+64)
return cur[::-1]
5.字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
class Solution:
def decodeString(self, s: str) -> str:
res=""
stack=[]
num=0
for ch in s:
if ch.isdigit():
num=num*10+int(ch)
elif ch=='[':
stack.append((res,num))
res,num="",0
elif ch==']':
top=stack.pop()
res=top[0]+res*top[1]
else:
res+=ch
return res