思路:对于应该首要和贡献联系起来,对于什么是贡献呢,即在某种情况下,会贡献出多少种,符合要求的结果,此题属于较为基础的,对于text中的一个字符如果是非pattern中的元素,则对结果无任何影响,如果出现pattern[0]则需考虑后方有多少个pattern[1],如果出现pattern[1]时则忽略,因为其在patern[0]中考虑过了,不能起点到终点算一次 ,终点到起点又算一次,对于最后的添加一个,也是差不多的既然可以随便放,当然选择放最边上,至于放哪边,则看pattern([0]/[1])谁多。
此时便容易联想到
方案一从后方开始,遍历如果出现pattern[1]则计数一次,当某时刻遍历到pattern[0]时则在结果累加计数器的值,含义为对结果贡献了计数器组子序列,同时pattern[0]也需计数,用以最后的操作。
对于方案一寻找漏洞:各有的的操作表面风平浪静,仔细一想,出现pattern[0]如果也同时出现了pattern[1],即pattern两字符相等,此时先后顺序应该怎么处理呢,仔细一想应该是先累加计数器的值,再对pattern进行计数的,思考过程忽略。
代码
long long maximumSubsequenceCount(string text, string pattern) {
int len = text.length(), cut_0 = 0, cut_1 = 0;
long int ret = 0;
for (int i = 0; i < len; i++) {
//先更新贡献,再继续计数,主要是为了应对pattern相同,不相同则无所谓先后,不存在同时满足情况。
if (text[i] == pattern[1]) { // 如果是结尾元素,则计算贡献
ret += cut_0;
cut_1++;
}
if (text[i] == pattern[0]) { // 如果是起点元素,则进行计数
cut_0++;
}
}
return ret + max(cut_0, cut_1);
}
结语:详细提到了心路历程,任然是大胆猜想,小心求证,在确定看下情况下尽可能考虑到更多的特殊情况。