字符串经典题目(Leetcode题解-Python语言)
344. 反轉字符串
class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""left = 0right = len(s) - 1while left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1雙指針法,左右各一個指針并且進行字符交換,注意只有列表才可以兩兩交換,字符串只能夠用切片反轉 [::-1]。
541. 反轉字符串 II
class Solution:def reverseStr(self, s: str, k: int) -> str:l = list(s)for i in range(0, len(l), 2*k):l[i:i+k] = l[i:i+k][::-1]return ''.join(l)按照題目的要求,每次遍歷 2k 個字符,然后對前 k 個字符進行反轉,字符串反轉用 [::-1] 即可。
557. 反轉字符串中的單詞 III
class Solution:def reverseWords(self, s: str) -> str:return ' '.join(word[::-1] for word in s.split(' '))用 split 分隔出每個單詞,然后用 [::-1] 反轉單詞,最后再用 join 結合一起即可。
125. 驗證回文串
class Solution:def isPalindrome(self, s: str) -> bool:left = 0right = len(s) - 1while left < right:if not s[left].isalnum():left += 1continueif not s[right].isalnum():right -= 1continueif s[left].lower() != s[right].lower():return Falseelse:left += 1right -= 1return True雙指針法,注意指針如果指向的不是數字或者字母就移到下一位,直到都指向數字或字符為止。然后對兩個指針指向的字符進行比較,直接轉化為小寫比較即可(對數字用小寫也不會報錯),不相等就返回 False,否則就下一位。
345. 反轉字符串中的元音字母
class Solution:def reverseVowels(self, s: str) -> str:l = list(s)left = 0right = len(s) - 1vowels = ('a', 'e', 'i', 'o', 'u')while left < right:while left < right and l[left].lower() not in vowels:left += 1while left < right and l[right].lower() not in vowels:right -= 1if left < right:l[left], l[right] = l[right], l[left]left += 1right -= 1return ''.join(l)還是雙指針法,同樣的,如果指針指向的不是元音字母就移到下一位,直到是元音字母為止,然后對兩個指針指向的字符進行交換即可。
3. 無重復字符的最長子串
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:left = 0right = 0window = dict()ans = 0while right < len(s):if s[right] not in window:window[s[right]] = 1else:window[s[right]] += 1while window[s[right]] > 1:window[s[left]] -= 1left += 1ans = max(ans, right - left + 1)right += 1return ans雙指針 + 滑動窗口,初始時先讓 right 指針向右移位,遍歷到的字符記錄在滑動窗口中,直到有字符是第二次出現,此時就開始讓 left 指針右移,直到滑動窗口中沒有重復字符為止,對所有的無重復字符子串(滑動窗口)取長度最大值即可。
151. 顛倒字符串中的單詞
class Solution:def reverseWords(self, s: str) -> str:return ' '.join(reversed(s.split()))這題用內置函數就是一行,要注意的是 reversed() 比切片反轉 [::-1] 要更快,因為前者只是生成了一個迭代器,而后者是創建了一個新的列表。如果是自己實現的話,代碼如下:
class Solution:def trim_spaces(self, s: str) -> list:left, right = 0, len(s) - 1# 去掉字符串開頭的空白字符while left <= right and s[left] == ' ':left += 1# 去掉字符串末尾的空白字符while left <= right and s[right] == ' ':right -= 1# 將字符串間多余的空白字符去除output = []while left <= right: # 等于right的也要考慮,因為只用了left一個指針遍歷if s[left] != ' ': # 不是空白字符output.append(s[left])elif output[-1] != ' ': # 是第一個出現的空白字符output.append(s[left])left += 1return outputdef reverse(self, l: list, left: int, right: int) -> None:while left < right:l[left], l[right] = l[right], l[left]left, right = left + 1, right - 1def reverse_each_word(self, l: list) -> None:n = len(l)start = end = 0while start < n:# 循環至單詞的末尾while end < n and l[end] != ' ':end += 1# 翻轉單詞self.reverse(l, start, end - 1)# 更新start,去找下一個單詞start = end + 1end += 1def reverseWords(self, s: str) -> str:l = self.trim_spaces(s)# 翻轉字符串self.reverse(l, 0, len(l) - 1)# 翻轉每個單詞self.reverse_each_word(l)return ''.join(l)分三步走:移除多余空格、將整個字符串反轉、將每個單詞反轉。要注意各個指針的范圍。
總結
以上是生活随笔為你收集整理的字符串经典题目(Leetcode题解-Python语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CHALI茶里联手趣拿,与你“香”约九九
- 下一篇: 移动端popstate的怪异行为