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

1,问题描述

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

难度:简单

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

如果存在这样的子字符串,返回 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 仅由小写英文字母组成。

2,初步思考

​ hashset处理即可

3,代码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package questions;

import java.util.HashSet;
import java.util.Set;

public class _3083字符串及其反转中是否存在同一子字符串 {

// 官方解法
public boolean isSubstringPresent_gov(String s) {
int n = s.length();
// masks[i] 二进制的第 j 位,记录 s 中字符 i 后边是否跟随 j
int[] masks = new int[26];
for (int i = 1; i < n; i++) {
int x = s.charAt(i - 1) - 'a';// 当前字符的索引
int y = s.charAt(i) - 'a';// 当前字符的后边字符的索引
masks[x] |= 1 << y;// 本质就是hashSet
if ((masks[y] >> x & 1) == 1) {
return true;
}
}
return false;
}

// 暴力解法
public boolean isSubstringPresent_brute(String s) {
for (int i = 0; i + 1 < s.length(); i++) {
String substr = new StringBuilder(s.substring(i, i + 2)).reverse().toString();
if (s.contains(substr)) {
return true;
}
}
return false;
}

// hashSet求解
public boolean isSubstringPresent(String s) {
Set<String> set = new HashSet<>();
int n = s.length();
for (int i = 1; i < n; i++) {
set.add(s.substring(i - 1, i + 1));
}
StringBuilder stringBuilder = new StringBuilder(s);
stringBuilder.reverse();
for (int i = 1; i < n; i++) {
if (set.contains(stringBuilder.substring(i - 1, i + 1))) {
return true;
}
}
return false;
}

}