返回

剑指LeetCode双周赛106:揭秘迷人数字与最长半重复子字符串的奥秘

闲谈

揭开迷人数字和半重复子字符串的面纱:算法与实战

迷人数字:定义与算法

准备踏上一段探索迷人数字的旅程。迷人数字就像数字界的独角兽,必须同时满足两个条件才能赢得这个称号:

  • 各位数字之和为偶数
  • 各位数字的平方和也是偶数

想象一下数字12345,它的各位之和为15(奇数),而各位平方之和为144(偶数)。因此,12345荣获了迷人数字的称号。

揭开迷人数字的秘密,我们遵循以下步骤:

  1. 将数字转换为字符串。
  2. 遍历字符串,将每个字符转换为数字。
  3. 计算各位数字之和。
  4. 计算各位数字的平方和。
  5. 检查这两个值是否都为偶数。
def is_charming(n):
    """
    判断一个数字是否是迷人的。

    Args:
        n: 要判断的数字。

    Returns:
        如果n是迷人的,则返回True,否则返回False。
    """

    # 将数字转换为字符串。
    s = str(n)

    # 遍历字符串,将每个字符转换为数字。
    digits = [int(c) for c in s]

    # 计算各位数字之和。
    sum_digits = sum(digits)

    # 计算各位数字的平方和。
    sum_squares = sum(d**2 for d in digits)

    # 检查这两个值是否都为偶数。
    return sum_digits % 2 == 0 and sum_squares % 2 == 0

寻找半重复子字符串:技巧与策略

现在,让我们将目光转向另一个激动人心的挑战:寻找半重复子字符串。半重复子字符串是指字符串中出现两次的子字符串。例如,“abcabcabc”中最长的半重复子字符串就是“abc”。

为了找出这个难以捉摸的字符串,我们采用以下策略:

  1. 生成字符串的所有子字符串。
  2. 检查每个子字符串是否在字符串中出现两次。
  3. 选择最长的半重复子字符串。
def longest_semi_repetitive_substring(s):
    """
    找到一个字符串中最长的半重复子字符串。

    Args:
        s: 要查找的字符串。

    Returns:
        最长的半重复子字符串。
    """

    # 生成字符串的所有子字符串。
    substrings = []
    for i in range(len(s)):
        for j in range(i + 1, len(s) + 1):
            substrings.append(s[i:j])

    # 检查每个子字符串是否在字符串中出现两次。
    semi_repetitive_substrings = []
    for substring in substrings:
        if s.count(substring) == 2:
            semi_repetitive_substrings.append(substring)

    # 选择最长的半重复子字符串。
    return max(semi_repetitive_substrings, key=len)

常见问题解答

  • Q:什么是迷人数字?
    A:迷人数字同时满足两个条件:各位数字之和为偶数,各位数字的平方和也是偶数。

  • Q:如何找到一个字符串中最长的半重复子字符串?
    A:生成字符串的所有子字符串,检查每个子字符串是否在字符串中出现两次,并选择最长的一个。

  • Q:为什么这些算法很重要?
    A:迷人数字算法可以用于密码学和数据验证,而半重复子字符串算法可以用于文本挖掘和比较。

  • Q:这些算法的复杂度是多少?
    A:迷人数字算法的时间复杂度为O(n),其中n是数字的位数。半重复子字符串算法的时间复杂度为O(n^3),其中n是字符串的长度。

  • Q:我可以在哪里找到更多关于这些算法的信息?
    A:有关迷人数字算法的更多信息,请访问:https://en.wikipedia.org/wiki/Charming_number。有关半重复子字符串算法的更多信息,请访问:https://www.geeksforgeeks.org/longest-repeating-subsequence/