目标
给你一个字符串 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
的子串是否在其反转后的字符串中出现,返回 true
或 false
。
直接的想法是将 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;
}
}