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(); 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; 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; }
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; }
}
|