- 無重複字符的最長子串、
解題代碼:
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
# 存儲歷史循環中最長的子串長度
max_len = 0
# 判斷傳入的字符串是否爲空
if s is None :
return max_len
# 定義一個字典,存儲不重複的字符和字符所在的下標
str_dict = {}
# 存儲每次循環中最長的子串長度
one_max = 0
# 記錄最近重複字符所在的位置+1
start = 0
for i in range(len(s)):
# 判斷當前字符是否在字典中和當前字符的下標是否大於等於最近重複字符的所在位置
if s[i] in str_dict and str_dict[s[i]] >= start:
# 記錄當前字符的值+1
start = str_dict[s[i]] + 1
# 在此次循環中,最大的不重複子串的長度
one_max = i - start + 1
# 把當前位置覆蓋字典中的位置
str_dict[s[i]] = i
# 比較此次循環的最大不重複子串長度和歷史循環最大不重複子串長度
max_len = max(max_len, one_max)
return max_len
- 最長迴文子串
解題代碼:
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
maxl = 0
start = 0
for i in range(n):
if i - maxl >= 1 and s[i-maxl-1: i+1] == s[i-maxl-1: i+1][::-1]:
start = i - maxl - 1
maxl += 2
continue
if i - maxl >= 0 and s[i-maxl: i+1] == s[i-maxl: i+1][::-1]:
start = i - maxl
maxl += 1
return s[start: start + maxl]
- 最長公共前綴
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 “”。
解題代碼:
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
res = ""
if len(strs) == 0:
return ""
for each in zip(*strs):#zip()函數用於將可迭代對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表
if len(set(each)) == 1:#利用集合創建一個無序不重複元素集
res += each[0]
else:
return res
return res
- 有效的括號
代碼如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
mapping={'(':')','[':']','{':'}'}
stack=[]
for char in s:
if char in mapping:
stack.append(char)
elif char in mapping.values():
if len(stack)==0 or mapping.get(stack[-1])!=char:
return False
else:
stack.pop()
if len(stack)==0:
return True
else:
return False
- 最後一個單詞的長度
代碼如下:
class Solution:
def lengthOfLastWord(self, s):
"""
:type s: str
:rtype: int
"""
str = ''
count = 0
for i in s[::-1]:
if str != '' and i==' ':
return count
if i != ' ':
count = count+ 1
str = str + i
return count
- 重複的子字符串
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
n=len(s)
for i in range(1,n):
base=s[:i]
if base*(n/i)==s:
return True
return False
- 不同字符的最小子序列
解題思路:參考 https://www.lizenghai.com/archives/4446.html
代碼
class Solution(object):
def smallestSubsequence(self, text):
"""
:type text: str
:rtype: str
"""
size = len(text)
stack = []
for i in range(size):
if text[i] in stack:
continue
while stack and ord(text[i]) < ord(stack[-1]) and \
text.find(stack[-1], i) != -1:
stack.pop()
stack.append(text[i])
return ''.join(stack)
- 字符串的最大公因子
解題思路:輾轉相除法
代碼如下:
class Solution(object):
def gcdOfStrings(self, str1, str2):
"""
:type str1: str
:type str2: str
:rtype: str
"""
l1, l2 = len(str1), len(str2)
if l2 > l1:
str1, str2 = str2, str1
l1, l2 = l2, l1
if l1 == l2:
return str1 if str1==str2 else ''
f = l1%l2
if f == 0:
return str2 if str2*(l1//l2)==str1 else ''
else:
return self.gcdOfStrings(str2, str1[-f:])
- 字符串中的第一個唯一字符
給定一個字符串,找到它的第一個不重複的字符,並返回它的索引。如果不存在,則返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
代碼:
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: int
"""
dic = dict()
for i in s:
if i in dic:
dic[i] = dic[i] + 1
else:
dic[i] = 1
for i in range(len(s)):
if dic[s[i]] == 1:
return i
return -1