【2022-12-06每日一题】1805. 字符串中不同整数的数目[Easy]

2022-12-06
2分钟阅读时长

2022-12-06每日一题:1805. 字符串中不同整数的数目

难度:Easy

标签:哈希表 、 字符串

给你一个字符串 word ,该字符串由数字和小写英文字母组成。

请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123""34""8""34"

返回对 word 完成替换后形成的 不同 整数的数目。

只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。

示例 1:

输入:word = "a123bc34d8ef34"
输出:3
解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。

示例 2:

输入:word = "leet1234code234"
输出:2

示例 3:

输入:word = "a1b01c001"
输出:1
解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。

提示:

  • 1 <= word.length <= 1000
  • word 由数字和小写英文字母组成

方法一:哈希表(自己)

详细思路过程见官方题解,这里只做个人刷题记录,方便后续查询阅读

func numDifferentIntegers(word string) int {
    nums := make(map[int]bool)
    num, valid := 0, false
    for _, c := range word {
        if c >= '0' && c <= '9' {
            num += num*10+int(c-'0')
            valid = true
        } else if valid {
            nums[num] = true
            num, valid = 0, false
        }
    }
    if valid {
        nums[num] = true
    }
    return len(nums)
}

复杂度分析

  • 时间复杂度: O(n)。
  • 空间复杂度: O(n)。

方法二:双指针+模拟

写法一

func numDifferentIntegers(word string) int {
    s, n := map[string]struct{}{}, len(word)
    for i := 0; i < n; i++ {
        if word[i] >= '0' && word[i] <= '9' {
            // 跳过前缀0
            for i < n && word[i] == '0' {
                i++
            }
            // 查找数字结束位置
            j := i
            for j < n && word[j] >= '0' && word[j] <= '9' {
                j++
            }
            s[word[i:j]] = struct{}{} // a000,此时word[i:j]为空字符串
            i = j
        }
    }
    return len(s)
}

写法二

func numDifferentIntegers(word string) int {
    s, n := map[string]bool{}, len(word)
    p1 := 0
    for {
        // 查找开始位置
        for p1 < n && !unicode.IsDigit(rune(word[p1])) {
            p1++
        }
        if p1 == n { break }
        // 查找结束位置
        p2 := p1
        for p2 < n && unicode.IsDigit(rune(word[p2])) {
            p2++
        }
        // 去重前导0
        for p2-p1 > 1 && word[p1] == '0' {
            p1++
        }
        s[word[p1:p2]] = true
        p1 = p2
    }
    return len(s)
}

复杂度分析

  • 时间复杂度: O(n)。
  • 空间复杂度: O(n)。

LeetCode题库地址