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

目标

给你一个字符串 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 仅由小写英文字母组成。

思路

判断字符串 s 中长度为 2 的子串是否在其反转后的字符串中出现,返回 truefalse

直接的想法是将 s 中所有长度为 2 的子串放入 hashset,然后判断倒序字符串的长度为 2 的子串是否在集合中。

网友题解使用 int[] 记录所有出现过的长度为 2 的子串,下标表示第一个字母,第二个字母则使用 int 值的 bit 位表示。

代码


/**
 * @date 2024-12-26 8:47
 */
public class IsSubstringPresent3083 {

    public boolean isSubstringPresent(String s) {
        int n = s.length();
        int[] exists = new int[26];
        for (int i = 0; i < n - 1; i++) {
            int a = s.charAt(i) - 'a';
            int b = s.charAt(i + 1) - 'a';
            exists[a] |= 1 << b;
            if ((exists[b] >> a & 1) == 1) {
                return true;
            }
        }
        return false;
    }

}

性能

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注