字符串及其反转中是否存在同一子字符串

标签: 哈希表 字符串

难度: Easy

给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。

如果存在这样的子字符串,返回 true;如果不存在,返回 false

示例 1:

输入:s = "leetcode"

输出:true

解释:子字符串 "ee" 的长度为 2,它也出现在 reverse(s) == "edocteel" 中。

示例 2:

输入:s = "abcba"

输出:true

解释:所有长度为 2 的子字符串 "ab""bc""cb""ba" 也都出现在 reverse(s) == "abcba" 中。

示例 3:

输入:s = "abcd"

输出:false

解释:字符串 s 中不存在满足「在其反转后的字符串中也出现」且长度为 2 的子字符串。

提示:

  • 1 <= s.length <= 100
  • 字符串 s 仅由小写英文字母组成。

Submission

运行时间: 16 ms

内存: 16.0 MB

class Solution:
    def isSubstringPresent(self, s: str) -> bool:
        ans=False
        for i in range(len(s)-1):
            if s[i:i+2] in s[::-1]:
                return True
        return False

Explain

该题解采用了一个简单的遍历和查找的方法。首先,对字符串s进行从头至尾的遍历,每次取出一个长度为2的子字符串,并检查这个子字符串是否存在于字符串s的反转字符串中。如果找到至少一个这样的子字符串,则立即返回true;如果遍历完成后没有找到任何匹配的子字符串,则返回false。

时间复杂度: O(n^2)

空间复杂度: O(n)

class Solution:
    def isSubstringPresent(self, s: str) -> bool:
        # 反转字符串s
        reversed_s = s[::-1]
        # 遍历原字符串的每个长度为2的子字符串
        for i in range(len(s)-1):
            # 检查当前子字符串是否在反转后的字符串中
            if s[i:i+2] in reversed_s:
                return True
        return False

Explore

选择长度为2的子字符串进行检查主要是因为这是实现上的一个简化和效率的折中。长度为2的子字符串足够简短,可以在合理的时间内检查其是否存在于反转字符串中。如果选择更长的子字符串,虽然可以提高特定情况下的检测精确度,但会显著增加计算复杂度和运行时间。同时,长度为2也是最短的能够提供方向性特征的子字符串(单个字符无法表示方向性),这使得算法能有效地检测到原字符串和其反转之间的关系。

在这个问题的上下文中,子字符串在原字符串和反转字符串中的相对位置并不影响结果的判断。算法的目的是检查任何长度为2的子字符串是否同时存在于原字符串及其反转字符串中,而不关心这些子字符串出现的具体位置。只要找到任何一个符合条件的子字符串,算法就会返回true,因此相对位置并不重要。

该算法基本上考虑了包含重复字符的情况,因为算法是通过检查子字符串是否存在于反转字符串中来工作的,不论这些字符是否重复。然而,对于长度为1的字符串,算法可能不会按预期工作,因为算法需要检查长度为2的子字符串。在这种情况下,算法会直接返回false,因为根本无法形成长度为2的子字符串。因此,对于极短的字符串,这种方法可能需要调整或明确指出其限制。