力扣难度
简单
算法评级: 2 知道常用数据结构和算法并简单使用
难度分 1173
题目:
给你一个字符串 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 的子字符串。
func isSubstringPresent(s string) bool {
}
// isSubstringPresent 函数用于判断给定字符串 s 中是否存在一对字符的子串,
// 这对字符以相反的顺序也出现过。
func isSubstringPresent(s string) bool {
// 创建一个 26×26 的布尔数组 vis,用于记录每对字符是否出现过。
// 索引的含义是:vis[x][y] 表示字符 x 和字符 y 组成的子串是否出现过。
// 这里的 x 和 y 是字符在字母表中的索引,从 0 到 25 分别对应 'a' 到 'z'。
vis := [26][26]bool{}
// 遍历字符串 s,从第二个字符开始,因为要检查相邻的两个字符组成的子串。
for i := 1; i < len(s); i++ {
// 计算当前字符对中第一个字符在字母表中的索引。
// 例如,如果字符是 'a',则 x 为 0;如果是 'b',则 x 为 1,以此类推。
x := s[i-1] - 'a'
// 计算当前字符对中第二个字符在字母表中的索引。
y := s[i] - 'a'
// 将当前字符对标记为已出现过。
vis[x][y] = true
// 检查是否存在相反顺序的字符对。
// 如果 vis[y][x] 为 true,说明字符 y 和字符 x 组成的子串也出现过,
// 即找到了满足条件的子串,返回 true。
if vis[y][x] {
return true
}
}
// 如果遍历完整个字符串都没有找到满足条件的子串,返回 false。
return false
}