学习计划:3个月内算法小成,完成leetcode hot100
当前进度:学完数组、链表
刷题语言:Python
时间:2025/02/11-2025/02/12
四、字符串
学习链接:代码随想录
因为字符串也是一种数组,所以元素在内存中是连续分布
1、反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
思路:左右双指针,交换元素位置即可
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left,right = 0,len(s)-1
print(left,right)
while left<right:
s[left],s[right] = s[right],s[left]
left+=1
right-=1
s反转--->s[::-1]
2、反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
思路:当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。
class Solution:
def reverseStr(self, s: str, k: int) -> str:
"""
1. 使用range(start, end, step)来确定需要调换的初始位置
2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
3. 用切片整体替换,而不是一个个替换.
"""
def reverse(str):
#字符串反转
left,right = 0,len(str)-1
while left<right:
str[left],str[right]=str[right],str[left]
left+=1
right-=1
return str
res = list(s) #字符串转成列表
for cur in range(0,len(s),2*k): #cur从0-n,步长为2k
print(cur)
res[cur:cur+k] = reverse(res[cur:cur+k])
return ''.join(res) #列表拼接回字符串
3、翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
思路:先对字符串按空格分割,转为列表,再用双指针交换元素位置,最后拼接回字符串
class Solution:
def reverseWords(self, s: str) -> str:
print(s[::-1]) #反转字符串
print(s.split()) #用空格分割,转为列表
words = s.split()
left,right=0,len(words)-1
while left<right:
words[left],words[right]=words[right],words[left] #类似字符串反转
left+=1
right-=1
return ' '.join(words) #再使用空格拼接为字符串
4、右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
思路:字符串拼接
#获取输入的数字k和字符串
k = int(input())
s = input()
#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
5、实现 strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
n = len(needle)
i = 0
if n==0:
return -1
while i<=len(haystack)-n:
if haystack[i:i+n] == needle:
return i
i+=1
return -1
补充:可以使用KMP前缀表算法。
6、重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
- 输入: "abab"
- 输出: True
- 解释: 可由子字符串 "ab" 重复两次构成。
思路:移动匹配,在s+s中搜索s(去掉首尾字符)
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
i=1
n=len(s)
s2 = s+s
while i<n: #不包含第一个和最后一个元素
if s==s2[i:i+n]:
return True
i+=1
return False
总结:
1、交换字符串元素
s[left],s[right] = s[right],s[left]
2、字符串元素反转
s = s[::-1]
3、字符串转列表
res = list(s)
4、字符串拼接
ss = s+s #直接用+号拼接两个字符串
5、列表拼接成字符串
str = ' '.join(res) #使用空格拼接
6、字符串分割
words = s.split() #用空格分割,转为列表
7、寻找子字符串
ss.find(s) #找到n个s返回n,没找到返回-1