Python每日一练(20230308)
目录
1. Excel表列名称 ★
2. 同构字符串 ★★
3. 分割回文串 II ★★★
🌟 每日一练刷题专栏
C/C++ 每日一练 专栏
Python 每日一练 专栏
1. Excel表列名称
给你一个整数 columnNumber
,返回它在 Excel 表中相对应的列名称。
例如:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
示例 1:
输入:columnNumber = 1 输出:"A"
示例 2:
输入:columnNumber = 28 输出:"AB"
示例 3:
输入:columnNumber = 701 输出:"ZY"
示例 4:
输入:columnNumber = 2147483647 输出:"FXSHRXW"
提示:
1 <= columnNumber <= 2^31 - 1
代码:
class Solution(object):
def convertToTitle(self, n):
"""
:type n: int
:rtype: str
"""
d = {}
r = []
a = ""
for i in range(1, 27):
d[i] = chr(64 + i)
if n <= 26:
return d[n]
if n % 26 == 0:
n = n / 26 - 1
a = "Z"
while n > 26:
s = n % 26
n = n // 26
r.append(s)
result = d[n]
for i in r[::-1]:
result += d[i]
return result + a
# %%
s = Solution()
print(s.convertToTitle(1))
print(s.convertToTitle(28))
print(s.convertToTitle(701))
print(s.convertToTitle(2147483647))
输出:
A
AB
ZY
FXSHRXW
2. 同构字符串
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add" 输出:true
示例 2:
输入:s = "foo", t = "bar" 输出:false
示例 3:
输入:s = "paper", t = "title" 输出:true
提示:
- 可以假设 s 和 t 长度相同。
代码:
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
if len(s) == None or len(s) < 2:
return True
smap = {}
for i in range(len(s)):
if s[i] not in smap and t[i] in smap.values():
return False
if s[i] in smap and smap[s[i]] != t[i]:
return False
smap[s[i]] = t[i]
return True
# %%
s = Solution()
print(s.isIsomorphic(s = "egg", t = "add"))
print(s.isIsomorphic(s = "foo", t = "bar"))
print(s.isIsomorphic(s = "paper", t = "title"))
输出:
True
False
True
3. 分割回文串 II
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = "aab" 输出:1 解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
示例 2:
输入:s = "a" 输出:0
示例 3:
输入:s = "ab" 输出:1
提示:
1 <= s.length <= 2000
s
仅由小写英文字母组成
代码:
class Solution:
def minCut(self, s):
size = len(s)
is_palindrome = [[False] * size for _ in range(size)]
for r in range(size):
for l in range(r, -1, -1):
if s[l] == s[r] and (r - l <= 2 or is_palindrome[l + 1][r - 1]):
is_palindrome[l][r] = True
dp = [i for i in range(size)]
for i in range(1, size):
if is_palindrome[0][i]:
dp[i] = 0
else:
dp[i] = min(dp[j] + 1 for j in range(i) if is_palindrome[j + 1][i])
return dp[-1]
# %%
s = Solution()
print(s.minCut(s = "aab"))
print(s.minCut(s = "a"))
print(s.minCut(s = "ab"))
输出:
1
0
1
其它做法:
class Solution(object):
def minCut(self, s):
n = len(s)
dp = [n] * n
for i in range(n):
if s[0: i + 1] == s[0: i + 1][::-1]:
dp[i] = 0
continue
for j in range(i):
if s[j + 1: i + 1] == s[j + 1: i + 1][::-1]:
dp[i] = min(dp[i], dp[j] + 1)
return dp[n - 1]
🌟 每日一练刷题专栏
持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
★ 收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!
C/C++ 每日一练 专栏 | |
Python 每日一练 专栏 |