. - 力扣(LeetCode)

class Solution:
	# 由题意可知插入的位置在最前面插入pattern[0],或者最后面插入pattern[1]即可,其他情况不需要考虑
	# 插入子序列出现频率少的字符即可
	# pattern[0]出现频次少就将pattern[0]插入到前面,pattern[1]出现频次少就将pattern[1]插入到最后面
	# 参考答案后:统计可将每次出现pattern[1]时,即可匹配在当前出现位置之前所有出现的pattern[0]字符组成子序列
	# 还需要特殊考虑当pattern[0]=pattern[1]时候的情况。当他们相等时,在任意位置插入该字符即可,然后使用等差数列求和公式求出结果
	# 参考答案是先判断pattern[1],即可兼容pattern[0]=pattern[1]的情况。不需要使用等差数列的累加,但是需要用两个if去判断,效率没有我这个高
	def maximumSubsequenceCount(self, text: str, pattern: str) -> int:
		ans = c1_count = c2_count = 0
		for c in text:
			if c == pattern[0]:
				c1_count += 1
			elif c == pattern[1]:
				c2_count += 1
				ans += c1_count
		if pattern[0] == pattern[1]:
			return (1 + c1_count - 1) * (c1_count + 1) // 2
		return ans + max(c1_count, c2_count)
		
	# 官方的解题
	def _maximumSubsequenceCount(self, text: str, pattern: str) -> int:
		res = cnt1 = cnt2 = 0
		for c in text:
			if c == pattern[1]:
				res += cnt1
				cnt2 += 1
			if c == pattern[0]:
				cnt1 += 1
		return res + max(cnt1, cnt2)