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

·   ·   ·   ·

  ·   ·


题目链接

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

分析

哈希表+位运算优化

可以想到朴素的实现,用两个指针去判断每个长度为 $2$ 的子串反转后是否还存在于原串中

上面的方法中,耗时较长的是遍历字符串去比较是否在原串中存在

我们可以维护一个哈希表,存储每个长度为 $2$ 的子串,这样就仅需 $O(n)$ 的时间判断是否存在于原串中

由于仅包含小写字母,所以我们使用数组 $cnt[26][26]$ 来实现哈希表

进一步的,可以将数组的第二维压缩为一个长度为 $26$ 的二进制数

如果存在字符串 $ab$,则将 $cnt[0]$ 的第二位设置为 $1$

代码实现

class Solution {
public:
    bool isSubstringPresent(string s) {
        vector<int> cnt(26, 0);

        for(int i = 1; i < s.size(); ++i) {
            int x = s[i - 1] - 'a', y = s[i] - 'a';
            cnt[x] |= 1 << y;
            if(cnt[y] >> x & 1)
                return true;
        }

        return false;
    }
};

复杂度分析

  • 时间复杂度:$O(n + C)$,其中 $n$ 为字符串 $s$ 的长度,$C$ 为字符集大小
  • 空间复杂度:$O(C)$