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]