目录
字符串
344. 反转字符串
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
提示:
- 1 < = s . l e n g t h < = 1 0 5 1 <= s.length <= 10^5 1<=s.length<=105
- s[i] 都是 ASCII 码表中的可打印字符
代码
- 双指针
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
for i in range(len(s)//2):
s[i], s[-1 - i] = s[-1 - i], s[i]
541. 反转字符串 II
题目
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
- 1 < = s . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
- s 仅由小写英文组成
- 1 <= k <= 104
代码
- 模拟
class Solution:
def reverseStr(self, s: str, k: int) -> str:
n = len(s)
res = ''
flap = -1
for i in range(0,len(s),k):
res += s[i:i+k][::flap]
flap = - flap
return res
# t = list(s)
# for i in range(0, len(t), 2 * k):
# t[i: i + k] = reversed(t[i: i + k])
# return "".join(t)
1844. 将所有数字用字符替换
题目
给你一个下标从 0 开始的字符串 s ,它的 偶数 下标处为小写英文字母,奇数 下标处为数字。
定义一个函数 shift(c, x) ,其中 c 是一个字符且 x 是一个数字,函数返回字母表中 c 后面第 x 个字符。
- 比方说,shift(‘a’, 5) = ‘f’ 和 shift(‘x’, 0) = ‘x’ 。
对于每个 奇数 下标 i ,你需要将数字 s[i] 用 shift(s[i-1], s[i]) 替换。
请你替换所有数字以后,将字符串 s 返回。题目 保证 shift(s[i-1], s[i]) 不会超过 ‘z’ 。
示例 1:
输入:s = "a1c1e1"
输出:"abcdef"
解释:数字被替换结果如下:
- s[1] -> shift('a',1) = 'b'
- s[3] -> shift('c',1) = 'd'
- s[5] -> shift('e',1) = 'f'
示例 2:
输入:s = "a1b2c3d4e"
输出:"abbdcfdhe"
解释:数字被替换结果如下:
- s[1] -> shift('a',1) = 'b'
- s[3] -> shift('b',2) = 'd'
- s[5] -> shift('c',3) = 'f'
- s[7] -> shift('d',4) = 'h'
提示:
- 1 <= s.length <= 100
- s 只包含小写英文字母和数字。
- 对所有 奇数 下标处的 i ,满足 shift(s[i-1], s[i]) <= ‘z’ 。
代码
- 模拟
class Solution:
def shift(self, c, x):
return chr(ord(c) + x)
def replaceDigits(self, s: str) -> str:
ss = [i for i in s]
for i in range(1,len(ss), 2):
ss[i] = self.shift(ss[i-1], int(ss[i]))
return "".join(ss)
# return "".join(chr(ord(s[i-1]) + int(s[i])) if s[i].isdigit() else s[i] for i in range(len(s)))
LCR 181. 字符串中的单词反转
题目
你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。
注意:输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入: message = "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: message = " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: message = "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
提示:
- 1 <= message.length <= 10^4
- message 中包含英文大小写字母、空格和数字
- message 中至少有一个单词
代码
- 双指针
class Solution:
def reverseMessage(self, message: str) -> str:
# 双指针
message = message.strip()
i = j = len(message) - 1
res = []
while i >= 0:
while i >= 0 and message[i] != ' ': i -= 1
res.append(message[i+1:j+1])
while i >= 0 and message[i] == ' ': i -= 1
j = i
return ' '.join(res)
# 分割 + 倒序 利用 “字符串分割”、“列表倒序” 的内置函数
# return ' '.join(message.strip().split()[::-1])
796. 旋转字符串
题目
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。
示例 1:
输入: s = "abcde", goal = "cdeab"
输出: true
示例 2:
输入: s = "abcde", goal = "abced"
输出: false
提示:
- 1 <= s.length, goal.length <= 100
- s 和 goal 由小写英文字母组成
代码
- 搜索子字符串
class Solution:
def rotateString(self, s: str, goal: str) -> bool:
return len(s) == len(goal) and s in (goal + goal)
459. 重复的子字符串
题目
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
- 1 <= s.length, goal.length <= 10^4
- s 和 goal 由小写英文字母组成
代码
- 字符串匹配
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:\
# 利用性质
return (s + s).find(s,1) != len(s)