检查某单词是否等于两单词之和

标签: 字符串

难度: Easy

字母的 字母值 取决于字母在字母表中的位置,从 0 开始 计数。即,'a' -> 0'b' -> 1'c' -> 2,以此类推。

对某个由小写字母组成的字符串 s 而言,其 数值 就等于将 s 中每个字母的 字母值 按顺序 连接转换 成对应整数。

  • 例如,s = "acb" ,依次连接每个字母的字母值可以得到 "021" ,转换为整数得到 21

给你三个字符串 firstWordsecondWordtargetWord ,每个字符串都由从 'a''j'含 'a''j' )的小写英文字母组成。

如果 firstWord secondWord数值之和 等于 targetWord 的数值,返回 true ;否则,返回 false

 

示例 1:

输入:firstWord = "acb", secondWord = "cba", targetWord = "cdb"
输出:true
解释:
firstWord 的数值为 "acb" -> "021" -> 21
secondWord 的数值为 "cba" -> "210" -> 210
targetWord 的数值为 "cdb" -> "231" -> 231
由于 21 + 210 == 231 ,返回 true

示例 2:

输入:firstWord = "aaa", secondWord = "a", targetWord = "aab"
输出:false
解释:
firstWord 的数值为 "aaa" -> "000" -> 0
secondWord 的数值为 "a" -> "0" -> 0
targetWord 的数值为 "aab" -> "001" -> 1
由于 0 + 0 != 1 ,返回 false

示例 3:

输入:firstWord = "aaa", secondWord = "a", targetWord = "aaaa"
输出:true
解释:
firstWord 的数值为 "aaa" -> "000" -> 0
secondWord 的数值为 "a" -> "0" -> 0
targetWord 的数值为 "aaaa" -> "0000" -> 0
由于 0 + 0 == 0 ,返回 true

 

提示:

  • 1 <= firstWord.length, secondWord.length, targetWord.length <= 8
  • firstWordsecondWordtargetWord 仅由从 'a''j'含 'a''j' )的小写英文字母组成

Submission

运行时间: 24 ms

内存: 16.7 MB

def numerical_value(word):
    return int(''.join(chr(ord(c) - ord('a') + ord('0')) for c in word))

class Solution:
    def isSumEqual(self, firstWord: str, secondWord: str, targetWord: str) -> bool:
        return numerical_value(firstWord) + numerical_value(secondWord) == numerical_value(targetWord)

Explain

该题解的核心思路是将每个字符串表示的字母按字母表顺序转换成相应的数字,形成一个字符串数字,然后将其转换成整数。对于每个字母,其对应的数字是它在字母表中的位置('a'为0,'b'为1,以此类推)。例如,'abc'会被转换成'012',随后转换成整数12。转换方法是通过ASCII码的操作实现的。解决方案中定义了一个辅助函数numerical_value来进行这个转换。最后,该函数比较firstWord和secondWord的数值之和是否等于targetWord的数值来决定返回true还是false。

时间复杂度: O(1)

空间复杂度: O(1)

def numerical_value(word):
    # 将单词转换为其字母值的数字形式
    return int(''.join(chr(ord(c) - ord('a') + ord('0')) for c in word))

class Solution:
    def isSumEqual(self, firstWord: str, secondWord: str, targetWord: str) -> bool:
        # 比较firstWord和secondWord的数值和是否等于targetWord的数值
        return numerical_value(firstWord) + numerical_value(secondWord) == numerical_value(targetWord)

Explore

在函数中使用`chr(ord(c) - ord('a') + ord('0'))`的目的是将每个字母转换成其对应的数字字符。例如,`'a'`转换成字符`'0'`,`'b'`转换成字符`'1'`,依此类推。这样做可以直接将单词转换成一个数字字符串,之后可以直接转换成整数进行计算。如果直接使用`ord(c) - ord('a')`,则结果是一个整数,而不是字符,这将导致无法直接通过拼接形成数字字符串。

在Python中,整数(int)类型具有动态大小,这意味着Python的整数可以根据需要自动扩展以容纳更大的数字,只受限于机器的内存。因此,在处理由多个字符组成的大数字时,即使数字非常大,Python也能够处理,不会造成整数溢出。这保证了即使是转换后的较大数字,例如'88888888',也能被Python正确处理和计算。

Python的整数类型(int)可以处理非常大的数字,其大小仅受限于计算机的可用内存。即使字符串长度为8,转换成的最大数字为'88888888',在Python中这个数字仍然可以被正常处理。由于Python整数的动态性,处理这样的大数字不会导致性能问题或溢出,Python将自动管理所需的内存空间。

在本题中,前导零在转换为整数时会被自动忽略。因此,即使`firstWord`和`secondWord`转换后的数字形式存在前导零(如`'00'`),转换成整数后都会变成0。因此,`'00'`转换成整数后是0,`'1'`转换后也是整数1。这意味着在比较时,只会比较整数值,前导零不会影响最终的比较结果。