1930. 长度为 3 的不同回文子序列
给你一个字符串 s ,返回 s 中 长度为 3 的不同回文子序列 的个数。
即便存在多种方法来构建相同的子序列,但相同的子序列只计数一次。
回文 是正着读和反着读一样的字符串。
子序列 是由原字符串删除其中部分字符(也可以不删除)且不改变剩余字符之间相对顺序形成的一个新字符串。
例如,"ace" 是 "abcde" 的一个子序列。
示例 1:
输入:s = "aabca"
输出:3
解释:长度为 3 的 3 个回文子序列分别是:
- "aba" ("aabca" 的子序列)
- "aaa" ("aabca" 的子序列)
- "aca" ("aabca" 的子序列)
示例 2:
输入:s = "adc"
输出:0
解释:"adc" 不存在长度为 3 的回文子序列。
示例 3:
输入:s = "bbcbaba"
输出:4
解释:长度为 3 的 4 个回文子序列分别是:
- "bbb" ("bbcbaba" 的子序列)
- "bcb" ("bbcbaba" 的子序列)
- "bab" ("bbcbaba" 的子序列)
- "aba" ("bbcbaba" 的子序列)
提示:
3 <= s.length <= 10**5
s 仅由小写英文字母组成
题解:
# @param {String} s
# @return {Integer}
def count_palindromic_subsequence(s)
h = {}
len = s.length
for i in 0...len
unless h.has_key?(s[i])
h[s[i]] = [i]
else
h[s[i]] << i
end
end
h.select {|k,v| v.length > 1}
cnt = 0
h1 = {}
h.each_pair do |k,v|
n = v.length
if n > 2
cnt += 1
end
if n >= 2
h1[k] = {}
v.each_with_index do |v1,i|
if i > 0 && v1 - v[i-1] > 1
for j in v[i-1]+1..v1-1
if h1[k].length == 25
break
end
unless h1[k].has_key?(s[j])
h1[k][s[j]] = 1
end
end
end
end
end
end
h1.keys.map {|k| h1[k].length}.sum + cnt
end