0
点赞
收藏
分享

微信扫一扫

【LeetCode】 2. 哈希表:无重复字符的最长子串 ; 罗马数字转换

颜路在路上 2024-12-02 阅读 3

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串
的长度。

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

错误答案

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        maxLen = -1
        hashmap = dict()
        for i in s:
            if i in hashmap:
                if len(hashmap) > maxLen:
                    maxLen = len(hashmap)
                hashmap = dict()
            hashmap[i] = 1

        if len(hashmap) > maxLen:
            maxLen = len(hashmap)

        if maxLen == -1:
            maxLen = len(s)

        return maxLen

当判断到有重复值的时候,应该从起始字符的下一个字符重新计数,而不是从重复值开始计算

修正

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        maxLen = 0  # 初始化最大长度
        hashmap = {}  # 用于记录字符和其索引
        start = 0  # 滑动窗口的起始位置
        
        for end, v in enumerate(s):
            if v in hashmap and hashmap[v] >= start:
                start = hashmap[v] + 1

            hashmap[v] = end

            maxLen = max(maxLen, end-start+1)

        return maxLen

整数转罗马数字

七个不同的符号代表罗马数字,其值如下:

符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。

示例 1:

输入:num = 3749

输出: “MMMDCCXLIX”

解释:

3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 © + 100 ©
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:

输入:num = 58

输出:“LVIII”

解释:

50 = L
8 = VIII
示例 3:

输入:num = 1994

输出:“MCMXCIV”

解释:

1000 = M
900 = CM
90 = XC
4 = IV

class Solution:
    def intToRoman(self, num: int) -> str:
        hMap = [(1000,'M'),(900,'CM'),(500,'D'),(400,'CD'),(100,'C'),(90,'XC'),(50,'L'),
        (40,'XL'),(10,'X'),(9,'IX'),(5,'V'),(4,'IV'),(1,'I')]
        s = ''
        for k,v in hMap:
            while num >= k:
                s += v
                num -= k
        return s

题目看起来会很复杂。
思路上是把数值拆解成罗马数字从大到小排序

举报

相关推荐

0 条评论