目录
151. 反转字符串中的单词
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
文章讲解:代码随想录
解题卡点:运行速度较慢
解题思路:移除多余空格;将整个字符串反转;将每个单词反转。由于python不能原位修改字符串,故后两个步骤可以合并。
另外,若能对字符串进行修改,使用双指针法移除空格,实现原地修改效果。类似于27. 移除元素。
提升运行速度的点:
①对原字符串加空格,可以统一识别单词结束,不需要额外判断;
②最后使用' '.join加空格,若在单词加入列表时加空格,反转列表后要额外对空格进行操作;
③将word作为字符串格式而不是列表格式,省略了格式转换的时间。
class Solution:
def reverseWords(self, s: str) -> str:
s += ' ' # 对原字符串加空格,便于识别到单词结束
sentence = []
word = ''
for idx in range(len(s)):
if s[idx].isalnum(): # 如果字符串中当前元素是字母或数字
word += s[idx] # 该元素添加到单词中
if not s[idx+1].isalnum(): # 如果该元素下一个是空格,代表单词结束
sentence.append(word) # 将单词添加到列表中
word = '' # 重置单词
sentence.reverse() # 迭代后列表中只有单词,没有空格,将其反转
return(' '.join(sentence))
# 时间复杂度 O(n)
# 空间复杂度 O(n)
Kama55. 右旋字符串
题目链接:55. 右旋字符串(第八期模拟笔试)
文章讲解:右旋字符串 | 代码随想录
解题卡点:对python来说好像太简单?
若可以修改字符串,则空间复杂度可为O(1),实现原地修改效果。
方法如下:
def main():
k = int(input())
s = input()
print(s[-k: ] + s[:-k])
if __name__ == '__main__':
main()
# 时间复杂度 O(n)
# 空间复杂度 O(n)
28. 找出字符串中第一个匹配项的下标
题目链接:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
文章讲解:代码随想录
解题卡点:难以理解KMP算法
理解思路:
①帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili
KMP算法关键在于:在当前对文本串和模式串检索的过程中,若出现了不匹配,如何充分利用已经匹配的部分。匹配到不正确的地方以前的子模式串跟上面的子文本串相等,所以子模式串的最长前缀,跟文本串的相同最长后缀有匹配,故从该已匹配部分继续进行元素对比。
②KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了_kmpnext数组通俗解法-优快云博客
理解next数组
459. 重复的子字符串
题目链接:459. 重复的子字符串 - 力扣(LeetCode)
文章讲解:代码随想录
解题卡点:难以理解KMP算法
暂时跳过,二刷再来