3083. 字符串及其反转中是否存在同一子字符串
3083. 字符串及其反转中是否存在同一子字符串 (Easy)
给你一个字符串 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
仅由小写英文字母组成。
分析
因为仅含小写英文字母,可以用一个 [26]int 数组记录长度为 2 的子串是否存在与 s 中,这样仅需要遍历一遍,且在遍历过程中判断逆序子串是否在 s 中。
func isSubstringPresent(s string) bool {
// memo[i] 代表以字母 i+'a' 开头的长度为 2 的子串是否在 s 中,如 memo[0] = b00000000000000000000000101, 表示 “aa" 和 “ac” 在 s 中
memo := [26]int{}
for i := 0; i < len(s)-1; i++ {
x, y := s[i]-'a', s[i+1]-'a'
memo[x] |= 1 << y
if memo[y]&(1<<x) != 0 {
return true
}
}
return false
}